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@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

Reply via email to