[PR c++/84497] ref to undefined tls init
authorPádraig Brady <p@draigbrady.com>
Mon, 5 Mar 2018 13:48:43 +0000 (13:48 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 5 Mar 2018 13:48:43 +0000 (13:48 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00209.html
PR c++/84497
* decl2.c (get_tls_init_fn): Check TYPE_HAS_TRIVIAL_DFLT too.

PR c++/84497
* g++.dg/cpp0x/pr84497.C: New.

Co-Authored-By: Jason Merrill <jason@redhat.com>
Co-Authored-By: Nathan Sidwell <nathan@acm.org>
From-SVN: r258244

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/pr84497.C [new file with mode: 0644]

index 942b7e89aaee086851f20836b30b5cda1f3b763c..e9b0e3bd28e3df0c8ce3fd601554e7147daebb86 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-05  Pádraig Brady  <P@draigBrady.com>
+           Jason  Merrill  <jason@redhat.com>
+           Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/84497
+       * decl2.c (get_tls_init_fn): Check TYPE_HAS_TRIVIAL_DFLT too.
+
 2018-03-03  Jason Merrill  <jason@redhat.com>
 
        PR c++/84686 - missing volatile loads.
index d2693ce458b6d6220df8f2c97be54e0f13475af4..49d680f6e807b873dd1dd5c1b9ccded1cd377832 100644 (file)
@@ -3337,7 +3337,8 @@ get_tls_init_fn (tree var)
          /* If the variable is defined somewhere else and might have static
             initialization, make the init function a weak reference.  */
          if ((!TYPE_NEEDS_CONSTRUCTING (obtype)
-              || TYPE_HAS_CONSTEXPR_CTOR (obtype))
+              || TYPE_HAS_CONSTEXPR_CTOR (obtype)
+              || TYPE_HAS_TRIVIAL_DFLT (obtype))
              && TYPE_HAS_TRIVIAL_DESTRUCTOR (obtype)
              && DECL_EXTERNAL (var))
            declare_weak (fn);
index 97ae0197d7001cd132b83e0c3d26d1530093a77d..b4a6556a5f9c84115a28f3a32e586d78730a513a 100644 (file)
@@ -1,3 +1,9 @@
+2018-03-05  Pádraig Brady  <P@draigBrady.com>
+           Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/84497
+       * g++.dg/cpp0x/pr84497.C: New.
+
 2018-03-05  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/84670
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr84497.C b/gcc/testsuite/g++.dg/cpp0x/pr84497.C
new file mode 100644 (file)
index 0000000..cb9d233
--- /dev/null
@@ -0,0 +1,37 @@
+// PR 84497 mismatch with thread constructor fn weakness
+// { dg-do compile { target c++11 } }
+// { dg-require-weak "" }
+
+struct Base
+{
+  int m;
+
+  Base() noexcept = default;  // trivial but not constexpr
+  ~Base() noexcept = default;
+};
+
+struct Derived : Base {};
+struct Container {
+  Base m;
+};
+
+#ifdef DEF
+// This bit for exposition only.
+// All items placed in .tbss
+// __tls_init simply sets __tls_guard
+// no aliases to __tls_init generated
+thread_local Base base_obj;
+thread_local Derived derived_obj;
+thread_local Container container_obj;
+#else
+// Erroneously created strong undef refs to
+// _ZTH11derived_obj, _ZTH13container_obj, _ZTH8base_obj
+extern thread_local Base base_obj;
+extern thread_local Derived derived_obj;
+extern thread_local Container container_obj;
+int main() { return !(&base_obj && &derived_obj && &container_obj);}
+#endif
+
+// { dg-final { scan-assembler ".weak\[ \t\]*_ZTH8base_obj" } }
+// { dg-final { scan-assembler ".weak\[ \t\]*_ZTH11derived_obj" } }
+// { dg-final { scan-assembler ".weak\[ \t\]*_ZTH13container_obj" } }