forked from OSchip/llvm-project
MS ABI: Don't allow dllexport/import on lambdas
This is to follow up on David's comment in http://reviews.llvm.org/D12422#235509 llvm-svn: 247718
This commit is contained in:
parent
3df1840cfc
commit
5869ec4c6c
clang
include/clang/Basic
lib/Sema
test/SemaCXX
|
@ -2274,6 +2274,8 @@ def err_attribute_dll_not_extern : Error<
|
|||
"%q0 must have external linkage when declared %q1">;
|
||||
def err_attribute_dll_thread_local : Error<
|
||||
"%q0 cannot be thread local when declared %q1">;
|
||||
def err_attribute_dll_lambda : Error<
|
||||
"lambda cannot be declared %0">;
|
||||
def warn_attribute_invalid_on_definition : Warning<
|
||||
"'%0' attribute cannot be specified on a definition">,
|
||||
InGroup<IgnoredAttributes>;
|
||||
|
|
|
@ -4335,6 +4335,14 @@ static void handleDLLAttr(Sema &S, Decl *D, const AttributeList &A) {
|
|||
}
|
||||
}
|
||||
|
||||
if (auto *MD = dyn_cast<CXXMethodDecl>(D)) {
|
||||
if (S.Context.getTargetInfo().getCXXABI().isMicrosoft() &&
|
||||
MD->getParent()->isLambda()) {
|
||||
S.Diag(A.getRange().getBegin(), diag::err_attribute_dll_lambda) << A.getName();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned Index = A.getAttributeSpellingListIndex();
|
||||
Attr *NewAttr = A.getKind() == AttributeList::AT_DLLExport
|
||||
? (Attr *)S.mergeDLLExportAttr(D, A.getRange(), Index)
|
||||
|
|
|
@ -1083,3 +1083,12 @@ template<typename T> template<typename U> __declspec(dllexport) constexpr int CT
|
|||
#endif // __has_feature(cxx_variable_templates)
|
||||
|
||||
// FIXME: Precedence rules seem to be different for classes.
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Lambdas
|
||||
//===----------------------------------------------------------------------===//
|
||||
// The MS ABI doesn't provide a stable mangling for lambdas, so they can't be imported or exported.
|
||||
#ifdef MS
|
||||
// expected-error@+2{{lambda cannot be declared 'dllexport'}}
|
||||
#endif
|
||||
auto Lambda = []() __declspec(dllexport) -> bool { return true; };
|
||||
|
|
|
@ -1339,3 +1339,14 @@ struct __declspec(dllimport) DerivedFromExplicitlyImportInstantiatedTemplate : p
|
|||
template <typename T> struct ExplicitInstantiationDeclTemplateBase { void func() {} };
|
||||
extern template struct ExplicitInstantiationDeclTemplateBase<int>;
|
||||
struct __declspec(dllimport) DerivedFromExplicitInstantiationDeclTemplateBase : public ExplicitInstantiationDeclTemplateBase<int> {};
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Lambdas
|
||||
//===----------------------------------------------------------------------===//
|
||||
// The MS ABI doesn't provide a stable mangling for lambdas, so they can't be imported or exported.
|
||||
#ifdef MS
|
||||
// expected-error@+4{{lambda cannot be declared 'dllimport'}}
|
||||
#else
|
||||
// expected-warning@+2{{'dllimport' attribute ignored on inline function}}
|
||||
#endif
|
||||
auto Lambda = []() __declspec(dllimport) -> bool { return true; };
|
||||
|
|
Loading…
Reference in New Issue