On 04/06/2014 02:20, Hans Wennborg wrote:
Uploading new version of the patch.
OK, if this isn't a system header workaround I have no concern with the approach. Minor nit below..
http://reviews.llvm.org/D3998 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaDecl.cpp test/CodeGenCXX/dllimport.cpp test/SemaCXX/dllimport.cpp D3998.10069.patch Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -2109,6 +2109,9 @@ "definition of dllimport data">; def err_attribute_dllimport_static_field_definition : Error< "definition of dllimport static field not allowed">; +def warn_attribute_dllimport_static_field_definition : Warning< + "definition of dllimport static field">, + InGroup<DiagGroup<"dllimport-static-field-def">>; def err_attribute_dll_member_of_dll_class : Error< "attribute %q0 cannot be applied to member of %q1 class">; def err_attribute_weakref_not_static : Error< Index: lib/Sema/SemaDecl.cpp =================================================================== --- lib/Sema/SemaDecl.cpp +++ lib/Sema/SemaDecl.cpp @@ -9061,10 +9061,17 @@ if (const DLLImportAttr *IA = VD->getAttr<DLLImportAttr>()) { if (VD->isStaticDataMember() && VD->isOutOfLine() && VD->isThisDeclarationADefinition()) { + // We allow definitions of dllimport class template static data members + // with a warning. + bool JustWarn = cast<CXXRecordDecl>(VD->getFirstDecl()->getDeclContext()) + ->getDescribedClassTemplate();
Name this IsValid. The fact it causes a warning is tangential. Otherwise fine at my end, handing over to Reid. Alp.
+ Diag(VD->getLocation(), - diag::err_attribute_dllimport_static_field_definition); + JustWarn ? diag::warn_attribute_dllimport_static_field_definition + : diag::err_attribute_dllimport_static_field_definition); Diag(IA->getLocation(), diag::note_attribute); - VD->setInvalidDecl(); + if (!JustWarn) + VD->setInvalidDecl(); } }Index: test/CodeGenCXX/dllimport.cpp=================================================================== --- test/CodeGenCXX/dllimport.cpp +++ test/CodeGenCXX/dllimport.cpp @@ -571,6 +571,15 @@ template class C<char>; }+namespace ClassTemplateStaticDef {+ template <typename T> struct __declspec(dllimport) S { + static int x; + }; + template <typename T> int S<T>::x; + // CHECK-DAG: @"\01?x@?$S@H@ClassTemplateStaticDef@@2HA" = available_externally dllimport global i32 0 + int f() { return S<int>::x; } +} + //===----------------------------------------------------------------------===// // Negative checks //===----------------------------------------------------------------------===// Index: test/SemaCXX/dllimport.cpp =================================================================== --- test/SemaCXX/dllimport.cpp +++ test/SemaCXX/dllimport.cpp @@ -816,9 +816,9 @@ template<typename T> inline void ImportClassTmplMembers<T>::staticInlineDef() {} template<typename T> void ImportClassTmplMembers<T>::staticInlineDecl() {}-template<typename T> int ImportClassTmplMembers<T>::StaticFieldDef; // expected-error{{definition of dllimport static field not allowed}}-template<typename T> const int ImportClassTmplMembers<T>::StaticConstFieldDef = 1; // expected-error{{definition of dllimport static field not allowed}} -template<typename T> constexpr int ImportClassTmplMembers<T>::ConstexprFieldDef; // expected-error{{definition of dllimport static field not allowed}} +template<typename T> int ImportClassTmplMembers<T>::StaticFieldDef; // expected-warning{{definition of dllimport static field}} +template<typename T> const int ImportClassTmplMembers<T>::StaticConstFieldDef = 1; // expected-warning{{definition of dllimport static field}} +template<typename T> constexpr int ImportClassTmplMembers<T>::ConstexprFieldDef; // expected-warning{{definition of dllimport static field}}// Redeclarations cannot add dllimport.@@ -853,13 +853,13 @@ template<typename T> __declspec(dllimport) void CTMR<T>::staticInlineDecl() {} // expected-error{{redeclaration of 'CTMR::staticInlineDecl' cannot add 'dllimport' attribute}}template<typename T> __declspec(dllimport) int CTMR<T>::StaticField = 1; // expected-error{{redeclaration of 'CTMR::StaticField' cannot add 'dllimport' attribute}}- // expected-error@-1{{definition of dllimport static field not allowed}} + // expected-warning@-1{{definition of dllimport static field}} // expected-note@-2{{attribute is here}} template<typename T> __declspec(dllimport) const int CTMR<T>::StaticConstField = 1; // expected-error{{redeclaration of 'CTMR::StaticConstField' cannot add 'dllimport' attribute}} - // expected-error@-1{{definition of dllimport static field not allowed}} + // expected-warning@-1{{definition of dllimport static field}} // expected-note@-2{{attribute is here}} template<typename T> __declspec(dllimport) constexpr int CTMR<T>::ConstexprField; // expected-error{{redeclaration of 'CTMR::ConstexprField' cannot add 'dllimport' attribute}} - // expected-error@-1{{definition of dllimport static field not allowed}} + // expected-warning@-1{{definition of dllimport static field}} // expected-note@-2{{attribute is here}}@@ -901,9 +901,9 @@template<typename T> template<typename U> void ImportClsTmplMemTmpl<T>::staticInlineDecl() {}#if __has_feature(cxx_variable_templates)-template<typename T> template<typename U> int ImportClsTmplMemTmpl<T>::StaticFieldDef; // expected-error{{definition of dllimport static field not allowed}} -template<typename T> template<typename U> const int ImportClsTmplMemTmpl<T>::StaticConstFieldDef = 1; // expected-error{{definition of dllimport static field not allowed}} -template<typename T> template<typename U> constexpr int ImportClsTmplMemTmpl<T>::ConstexprFieldDef; // expected-error{{definition of dllimport static field not allowed}} +template<typename T> template<typename U> int ImportClsTmplMemTmpl<T>::StaticFieldDef; // expected-warning{{definition of dllimport static field}} +template<typename T> template<typename U> const int ImportClsTmplMemTmpl<T>::StaticConstFieldDef = 1; // expected-warning{{definition of dllimport static field}} +template<typename T> template<typename U> constexpr int ImportClsTmplMemTmpl<T>::ConstexprFieldDef; // expected-warning{{definition of dllimport static field}} #endif // __has_feature(cxx_variable_templates)@@ -935,13 +935,13 @@ #if __has_feature(cxx_variable_templates)template<typename T> template<typename U> __declspec(dllimport) int CTMTR<T>::StaticField = 1; // expected-error{{redeclaration of 'CTMTR::StaticField' cannot add 'dllimport' attribute}} - // expected-error@-1{{definition of dllimport static field not allowed}} + // expected-warning@-1{{definition of dllimport static field}} // expected-note@-2{{attribute is here}} template<typename T> template<typename U> __declspec(dllimport) const int CTMTR<T>::StaticConstField = 1; // expected-error{{redeclaration of 'CTMTR::StaticConstField' cannot add 'dllimport' attribute}} - // expected-error@-1{{definition of dllimport static field not allowed}} + // expected-warning@-1{{definition of dllimport static field}} // expected-note@-2{{attribute is here}} template<typename T> template<typename U> __declspec(dllimport) constexpr int CTMTR<T>::ConstexprField; // expected-error{{redeclaration of 'CTMTR::ConstexprField' cannot add 'dllimport' attribute}} - // expected-error@-1{{definition of dllimport static field not allowed}} + // expected-warning@-1{{definition of dllimport static field}} // expected-note@-2{{attribute is here}} #endif // __has_feature(cxx_variable_templates)@@ -976,3 +976,10 @@void __declspec(dllimport) foo(); void __declspec(dllexport) bar(); }; + +namespace ImportedExplicitSpecialization { +template <typename T> struct S { static int x; }; +template <typename T> int S<T>::x = sizeof(T); +template <> struct __declspec(dllimport) S<int> { static int x; }; // expected-note{{attribute is here}} +int S<int>::x = -1; // expected-error{{definition of dllimport static field not allowed}} +} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
-- http://www.nuanti.com the browser experts _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
