[PATCH] Downgrade "definition of dllimport static field" error to warning for class templates (PR19902)
Alp Toker
alp at nuanti.com
Tue Jun 3 16:40:08 PDT 2014
On 04/06/2014 02:36, Alp Toker wrote:
>
> 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.
Sorry, that should be *IsInvalid* and invert the meaning for it to make
sense.
Alp.
>
> 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