[PATCH] Downgrade "definition of dllimport static field" error to warning for class templates (PR19902)
Alp Toker
alp at nuanti.com
Tue Jun 3 16:36:41 PDT 2014
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 at 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 at -1{{definition of dllimport static field not allowed}}
> + // expected-warning at -1{{definition of dllimport static field}}
> // expected-note at -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 at -1{{definition of dllimport static field not allowed}}
> + // expected-warning at -1{{definition of dllimport static field}}
> // expected-note at -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 at -1{{definition of dllimport static field not allowed}}
> + // expected-warning at -1{{definition of dllimport static field}}
> // expected-note at -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 at -1{{definition of dllimport static field not allowed}}
> + // expected-warning at -1{{definition of dllimport static field}}
> // expected-note at -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 at -1{{definition of dllimport static field not allowed}}
> + // expected-warning at -1{{definition of dllimport static field}}
> // expected-note at -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 at -1{{definition of dllimport static field not allowed}}
> + // expected-warning at -1{{definition of dllimport static field}}
> // expected-note at -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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
http://www.nuanti.com
the browser experts
More information about the cfe-commits
mailing list