From: Mark Mitchell Date: Tue, 14 Sep 2004 00:29:03 +0000 (+0000) Subject: re PR c++/16716 (ICE in cp_parser_parse_and_diagnose_invalid_type_name) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3590f0a64a649dad84c2819a54226b5faf9fcb50;p=gcc.git re PR c++/16716 (ICE in cp_parser_parse_and_diagnose_invalid_type_name) PR c++/16716 * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): Robustify. PR c++/17327 * pt.c (unify): Add ENUMERAL_TYPE case. Replace sorry with gcc_unreacable. PR c++/16716 * g++.dg/parse/crash17.C: New test. PR c++/17327 * g++.dg/template/enum3.C: New test. From-SVN: r87467 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 37f08119566..010320136dd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2004-09-13 Mark Mitchell + + PR c++/16716 + * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): + Robustify. + + PR c++/17327 + * pt.c (unify): Add ENUMERAL_TYPE case. Replace sorry with + gcc_unreacable. + 2004-09-12 Richard Henderson PR c++/16254 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0f6821e546b..6ac5c717d3f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2286,13 +2286,10 @@ cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser) cp_parser_abort_tentative_parse (parser); return false; } - if (!cp_parser_parse_definitely (parser)) + if (!cp_parser_parse_definitely (parser) + || TREE_CODE (id) != IDENTIFIER_NODE) return false; - /* If we got here, this cannot be a valid variable declaration, thus - the cp_parser_id_expression must have resolved to a plain identifier - node (not a TYPE_DECL or TEMPLATE_ID_EXPR). */ - gcc_assert (TREE_CODE (id) == IDENTIFIER_NODE); /* Emit a diagnostic for the invalid type. */ cp_parser_diagnose_invalid_type_name (parser, parser->scope, id); /* Skip to the end of the declaration; there's no point in diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 0a6b773d1ad..90efa06d7cc 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9975,6 +9975,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict) case VECTOR_TYPE: case INTEGER_TYPE: case BOOLEAN_TYPE: + case ENUMERAL_TYPE: case VOID_TYPE: if (TREE_CODE (arg) != TREE_CODE (parm)) return 1; @@ -10136,10 +10137,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict) else return 0; } - else - sorry ("use of `%s' in template type unification", - tree_code_name [(int) TREE_CODE (parm)]); - + gcc_unreachable (); return 1; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2fa43121cfc..f81a893348c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2004-09-13 Mark Mitchell + + PR c++/16716 + * g++.dg/parse/crash17.C: New test. + + PR c++/17327 + * g++.dg/template/enum3.C: New test. + 2004-09-13 Hans-Peter Nilsson * lib/gcc-defs.exp: Load wrapper.exp. diff --git a/gcc/testsuite/g++.dg/parse/crash17.C b/gcc/testsuite/g++.dg/parse/crash17.C new file mode 100644 index 00000000000..bdc66399f27 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/crash17.C @@ -0,0 +1,9 @@ +// PR c++/16716 + +template class allocator; + +template class vector { + // With the dg-error on the next line, we are really just trying to + // check that the message is not an ICE message. + typedef typename allocator allocator_type; // { dg-error "expected|forbids" } +}; diff --git a/gcc/testsuite/g++.dg/template/enum3.C b/gcc/testsuite/g++.dg/template/enum3.C new file mode 100644 index 00000000000..b248d788c50 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/enum3.C @@ -0,0 +1,8 @@ +// PR c++/17327 + +enum E { E0, E1 }; +template class A {}; +template void f(A) {} +// We used to issue a "sorry" message. By using an explicit error +// message below, we make sure that we will not match "sorry". +template void f(A); // { dg-error "template-id" }