[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