aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <p@draigbrady.com>2018-03-05 13:48:43 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2018-03-05 13:48:43 +0000
commit35a313aaf210f8b4c901de178b46820383dbfd3b (patch)
tree61627b35295f2fcb1a4802ac70f1b654c76713f5
parent36a9f50ca9813b31879486a6eb536745dd43b9f5 (diff)
downloadgcc-35a313aaf210f8b4c901de178b46820383dbfd3b.zip
gcc-35a313aaf210f8b4c901de178b46820383dbfd3b.tar.gz
gcc-35a313aaf210f8b4c901de178b46820383dbfd3b.tar.bz2
[PR c++/84497] ref to undefined tls init
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
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/decl2.c3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/pr84497.C37
4 files changed, 52 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 942b7e8..e9b0e3b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index d2693ce..49d680f 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 97ae019..b4a6556 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..cb9d233
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/pr84497.C
@@ -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" } }