aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2005-01-29 02:07:18 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2005-01-29 02:07:18 +0000
commit6ca2d67f225c78e3f880c5fa9e04a0b961a3b386 (patch)
tree407a870ca11b68433505bddec0cc8234dcc87967 /gcc
parentee921ddf2138f35cae582ef7fa13e22eaa9ece50 (diff)
downloadgcc-6ca2d67f225c78e3f880c5fa9e04a0b961a3b386.zip
gcc-6ca2d67f225c78e3f880c5fa9e04a0b961a3b386.tar.gz
gcc-6ca2d67f225c78e3f880c5fa9e04a0b961a3b386.tar.bz2
re PR c++/19253 (bad error message / ICE for invalid template parameter)
PR c++/19253 * parser.c (cp_parser_diagnose_invalid_type_name): Commit to tentative parses. PR c++/19253 * g++.dg/template/crash33.C: New test. From-SVN: r94403
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/parser.c6
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/template/crash33.C8
4 files changed, 20 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 077113c..dbb8551 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2005-01-28 Mark Mitchell <mark@codesourcery.com>
+ PR c++/19253
+ * parser.c (cp_parser_diagnose_invalid_type_name): Commit to
+ tentative parses.
+
PR c++/19667
* pt.c (redeclare_class_template): Robustify.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9b43eff..1599d9c 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -1961,7 +1961,10 @@ cp_parser_non_integral_constant_expression (cp_parser *parser,
}
/* Emit a diagnostic for an invalid type name. SCOPE is the
- qualifying scope (or NULL, if none) for ID. */
+ qualifying scope (or NULL, if none) for ID. This function commits
+ to the current active tentative parse, if any. (Otherwise, the
+ problematic construct might be encountered again later, resulting
+ in duplicate error messages.) */
static void
cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id)
@@ -2033,6 +2036,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser, tree scope, tree id)
else
gcc_unreachable ();
}
+ cp_parser_commit_to_tentative_parse (parser);
}
/* Check for a common situation where a type-name should be present,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 06c06d3..dd24748 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2005-01-28 Mark Mitchell <mark@codesourcery.com>
+ PR c++/19253
+ * g++.dg/template/crash33.C: New test.
+
PR c++/19667
* g++.dg/template/crash32.C: New test.
diff --git a/gcc/testsuite/g++.dg/template/crash33.C b/gcc/testsuite/g++.dg/template/crash33.C
new file mode 100644
index 0000000..059e328
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/crash33.C
@@ -0,0 +1,8 @@
+// PR c++/19253
+
+namespace N {}
+
+template<typename> struct A
+{
+ A<typename N::X<int> > a; // { dg-error "" }
+};