aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/mangle.c4
-rw-r--r--gcc/testsuite/g++.dg/pr94027.C22
3 files changed, 31 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f01563e..98640a6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2020-03-06 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/94027
+ * mangle.c (find_substitution): Don't call same_type_p on template
+ args that cannot match.
+
2020-03-04 Martin Sebor <msebor@redhat.com>
PR c++/90938
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index a0e888f..1fc78bf 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -628,6 +628,8 @@ find_substitution (tree node)
{
tree args = CLASSTYPE_TI_ARGS (type);
if (TREE_VEC_LENGTH (args) == 3
+ && (TREE_CODE (TREE_VEC_ELT (args, 0))
+ == TREE_CODE (char_type_node))
&& same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
&& is_std_substitution_char (TREE_VEC_ELT (args, 1),
SUBID_CHAR_TRAITS)
@@ -652,7 +654,7 @@ find_substitution (tree node)
args <char, std::char_traits<char> > . */
tree args = CLASSTYPE_TI_ARGS (type);
if (TREE_VEC_LENGTH (args) == 2
- && TYPE_P (TREE_VEC_ELT (args, 0))
+ && TREE_CODE (TREE_VEC_ELT (args, 0)) == TREE_CODE (char_type_node)
&& same_type_p (TREE_VEC_ELT (args, 0), char_type_node)
&& is_std_substitution_char (TREE_VEC_ELT (args, 1),
SUBID_CHAR_TRAITS))
diff --git a/gcc/testsuite/g++.dg/pr94027.C b/gcc/testsuite/g++.dg/pr94027.C
new file mode 100644
index 0000000..03cd68f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr94027.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+// PR 94027 ICE mangling
+
+class a {
+public:
+ a (char);
+};
+struct b {
+ b (a);
+};
+template <typename... aw, int...>
+void ax (int)
+{
+ struct c : b {
+ c () : b {sizeof...(aw)}
+ {}
+ };
+}
+
+void az() {
+ ax ({});
+}