aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2017-01-18 12:51:28 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2017-01-18 12:51:28 +0000
commit2c65d990eb80d25c2e040be14a2918a0311dc37c (patch)
treebbf98d9a04aae9c4ebfded82b2bff8a61db8437b
parent928bff1905fa3d690048a3ab104bcf5d6a57176c (diff)
downloadgcc-2c65d990eb80d25c2e040be14a2918a0311dc37c.zip
gcc-2c65d990eb80d25c2e040be14a2918a0311dc37c.tar.gz
gcc-2c65d990eb80d25c2e040be14a2918a0311dc37c.tar.bz2
re PR c++/79091 (ICE in write_unnamed_type)
PR c++/79091 * mangle.c (write_exception_spec): Check nothrow explicitly. (write_encoding): Don't increment processing_template_decl around encoding. PR c++/79091 * g++.dg/pr79091.C: New. From-SVN: r244575
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/mangle.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/pr79091.C25
4 files changed, 43 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a42454a..7733be7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2017-01-18 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/79091
+ * mangle.c (write_exception_spec): Check nothrow explicitly.
+ (write_encoding): Don't increment processing_template_decl around
+ encoding.
+
2017-01-18 Markus Trippelsdorf <markus@trippelsdorf.de>
PR c++/70182
diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c
index d1b107c..033660f 100644
--- a/gcc/cp/mangle.c
+++ b/gcc/cp/mangle.c
@@ -366,17 +366,19 @@ write_exception_spec (tree spec)
return;
}
- if (nothrow_spec_p (spec))
+ if (spec == noexcept_true_spec || spec == empty_except_spec)
write_string ("Do");
- else if (TREE_PURPOSE (spec))
+ else if (tree expr = TREE_PURPOSE (spec))
{
- gcc_assert (uses_template_parms (TREE_PURPOSE (spec)));
+ /* noexcept (expr) */
+ gcc_assert (uses_template_parms (expr));
write_string ("DO");
- write_expression (TREE_PURPOSE (spec));
+ write_expression (expr);
write_char ('E');
}
else
{
+ /* throw (type-list) */
write_string ("Dw");
for (tree t = spec; t; t = TREE_CHAIN (t))
write_type (TREE_VALUE (t));
@@ -829,7 +831,6 @@ write_encoding (const tree decl)
if (tmpl)
{
- ++processing_template_decl;
fn_type = get_mostly_instantiated_function_type (decl);
/* FN_TYPE will not have parameter types for in-charge or
VTT parameters. Therefore, we pass NULL_TREE to
@@ -846,9 +847,6 @@ write_encoding (const tree decl)
write_bare_function_type (fn_type,
mangle_return_type_p (decl),
d);
-
- if (tmpl)
- --processing_template_decl;
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 738afb6..6822d3d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-18 Nathan Sidwell <nathan@acm.org>
+
+ PR c++/79091
+ * g++.dg/pr79091.C: New.
+
2017-01-17 Joe Seymour <joe.s@somniumtech.com>
* gcc.target/msp430/mul_f5_muldef.c: New test.
diff --git a/gcc/testsuite/g++.dg/pr79091.C b/gcc/testsuite/g++.dg/pr79091.C
new file mode 100644
index 0000000..ad8cf5a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr79091.C
@@ -0,0 +1,25 @@
+// PR 79091 ICE mangling an unnamed enum in a tempate instantiation.
+
+enum {
+ One = 1
+};
+
+template<int Options>
+class Matrix {};
+
+template<int Dim>
+Matrix<Dim ? One : 0> *Bar ()
+{
+ return 0;
+}
+
+template<int Opt>
+Matrix<Opt> *Baz ()
+{
+ return 0;
+}
+
+bool Foo ()
+{
+ return Baz<1> () == Bar<1> ();
+}