Author: hans Date: Tue Sep 15 16:05:30 2015 New Revision: 247718 URL: http://llvm.org/viewvc/llvm-project?rev=247718&view=rev Log: 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 Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/test/SemaCXX/dllexport.cpp cfe/trunk/test/SemaCXX/dllimport.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=247718&r1=247717&r2=247718&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Sep 15 16:05:30 2015 @@ -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>; Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=247718&r1=247717&r2=247718&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Tue Sep 15 16:05:30 2015 @@ -4335,6 +4335,14 @@ static void handleDLLAttr(Sema &S, Decl } } + 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) Modified: cfe/trunk/test/SemaCXX/dllexport.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/dllexport.cpp?rev=247718&r1=247717&r2=247718&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/dllexport.cpp (original) +++ cfe/trunk/test/SemaCXX/dllexport.cpp Tue Sep 15 16:05:30 2015 @@ -1083,3 +1083,12 @@ template<typename T> template<typename U #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; }; Modified: cfe/trunk/test/SemaCXX/dllimport.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/dllimport.cpp?rev=247718&r1=247717&r2=247718&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/dllimport.cpp (original) +++ cfe/trunk/test/SemaCXX/dllimport.cpp Tue Sep 15 16:05:30 2015 @@ -1339,3 +1339,14 @@ struct __declspec(dllimport) DerivedFrom 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; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits