diff options
author | Mark Mitchell <mark@codesourcery.com> | 2005-01-29 02:07:18 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2005-01-29 02:07:18 +0000 |
commit | 6ca2d67f225c78e3f880c5fa9e04a0b961a3b386 (patch) | |
tree | 407a870ca11b68433505bddec0cc8234dcc87967 /gcc | |
parent | ee921ddf2138f35cae582ef7fa13e22eaa9ece50 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/parser.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash33.C | 8 |
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 "" } +}; |