aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-01-12 09:21:53 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-01-12 09:21:53 +0100
commit723033a6b2ce651e9fded5af3a820ad605cbfed0 (patch)
tree8cc7d55e8ab77206f6039b302671e3002677fab7 /gcc
parent3df6ff355fc898d685bb9e0688634a65c1dc29fd (diff)
downloadgcc-723033a6b2ce651e9fded5af3a820ad605cbfed0.zip
gcc-723033a6b2ce651e9fded5af3a820ad605cbfed0.tar.gz
gcc-723033a6b2ce651e9fded5af3a820ad605cbfed0.tar.bz2
re PR c++/66808 (tree check fail in symbol_table::decl_assembler_name_hash)
PR c++/66808 PR c++/69000 * pt.c (tsubst_decl): If not local_p, clear DECL_TEMPLATE_INFO. * g++.dg/tls/pr66808.C: New test. * g++.dg/tls/pr69000.C: New test. From-SVN: r232259
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c9
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/tls/pr66808.C10
-rw-r--r--gcc/testsuite/g++.dg/tls/pr69000.C19
5 files changed, 49 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ba7cf58..c8b8160 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/66808
+ PR c++/69000
+ * pt.c (tsubst_decl): If not local_p, clear DECL_TEMPLATE_INFO.
+
2016-01-11 Jason Merrill <jason@redhat.com>
PR c++/69131
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index ad5099f..edec774 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12292,8 +12292,13 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
SET_DECL_IMPLICIT_INSTANTIATION (r);
register_specialization (r, gen_tmpl, argvec, false, hash);
}
- else if (!cp_unevaluated_operand)
- register_local_specialization (r, t);
+ else
+ {
+ if (DECL_LANG_SPECIFIC (r))
+ DECL_TEMPLATE_INFO (r) = NULL_TREE;
+ if (!cp_unevaluated_operand)
+ register_local_specialization (r, t);
+ }
DECL_CHAIN (r) = NULL_TREE;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 97562b9..1866304 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-01-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/66808
+ PR c++/69000
+ * g++.dg/tls/pr66808.C: New test.
+ * g++.dg/tls/pr69000.C: New test.
+
2016-01-11 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/swaps-p8-23.c: New test.
diff --git a/gcc/testsuite/g++.dg/tls/pr66808.C b/gcc/testsuite/g++.dg/tls/pr66808.C
new file mode 100644
index 0000000..e977987
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/pr66808.C
@@ -0,0 +1,10 @@
+// PR c++/66808
+// { dg-do compile { target c++11 } }
+// { dg-require-effective-target tls }
+
+template <typename>
+class A {
+ int *b = foo ();
+ int *foo () { static __thread int a; return &a; }
+};
+A<int> b;
diff --git a/gcc/testsuite/g++.dg/tls/pr69000.C b/gcc/testsuite/g++.dg/tls/pr69000.C
new file mode 100644
index 0000000..74cdd4b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tls/pr69000.C
@@ -0,0 +1,19 @@
+// PR c++/69000
+// { dg-do compile }
+// { dg-require-effective-target tls }
+
+class A {};
+
+template <typename T>
+struct B
+{
+ static int *& foo () { static __thread int *c = 0; return c; }
+};
+
+B<A> d;
+
+void
+bar ()
+{
+ d.foo ();
+}