aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-04-13 20:32:13 -0400
committerJason Merrill <jason@redhat.com>2021-04-13 20:32:13 -0400
commit0589be0c59767cf4cbb0ef0e7d918cf6aa3d606c (patch)
tree29da9c11552509842a37773dd6000c6f4defd7b3
parent006783f4b165dff25aae3697920fcf54754dddd4 (diff)
downloadgcc-0589be0c59767cf4cbb0ef0e7d918cf6aa3d606c.zip
gcc-0589be0c59767cf4cbb0ef0e7d918cf6aa3d606c.tar.gz
gcc-0589be0c59767cf4cbb0ef0e7d918cf6aa3d606c.tar.bz2
c++: DWARF ICE with defaulted specialization [PR90674]
Here when we merged the specialization with the implicit instantiation declaration, we wrongly kept the value of DECL_INITIALIZED_IN_CLASS_P from the latter. gcc/cp/ChangeLog: PR c++/90674 * decl.c (duplicate_decls): Don't propagate DECL_INITIALIZED_IN_CLASS_P to a specialization. gcc/testsuite/ChangeLog: PR c++/90674 * g++.dg/debug/defaulted1.C: New test.
-rw-r--r--gcc/cp/decl.c5
-rw-r--r--gcc/testsuite/g++.dg/debug/defaulted1.C10
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index ec05ee1..1cb4731 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -2556,8 +2556,9 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden)
if (!DECL_USE_TEMPLATE (newdecl))
DECL_USE_TEMPLATE (newdecl) = DECL_USE_TEMPLATE (olddecl);
- DECL_INITIALIZED_IN_CLASS_P (newdecl)
- |= DECL_INITIALIZED_IN_CLASS_P (olddecl);
+ if (!DECL_TEMPLATE_SPECIALIZATION (newdecl))
+ DECL_INITIALIZED_IN_CLASS_P (newdecl)
+ |= DECL_INITIALIZED_IN_CLASS_P (olddecl);
}
/* Don't really know how much of the language-specific
diff --git a/gcc/testsuite/g++.dg/debug/defaulted1.C b/gcc/testsuite/g++.dg/debug/defaulted1.C
new file mode 100644
index 0000000..3ea7ae7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/defaulted1.C
@@ -0,0 +1,10 @@
+// PR c++/90674
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct C {
+ C() {}
+};
+
+template<>
+C<int>::C() = default;