From e08607323876b31915e5c5d24115f1937d6ee61f Mon Sep 17 00:00:00 2001 From: Mark Mitchell <mark@codesourcery.com> Date: Wed, 22 Jan 2003 22:24:30 +0000 Subject: [PATCH] re PR c++/9298 ([new parser] ICE with function-pointer-type template args) PR c++/9298 * parser.c (cp_parser_consume_semicolon_at_end_of_statement): New function. (cp_parser_expression_statement): Use it. (cp_parser_explicit_instantiation): Likewise. * pt.c (do_decl_instantiation): Improve error handling logic. PR c++/9298 * g++.dg/parse/template1.C: New test. From-SVN: r61618 --- gcc/cp/ChangeLog | 9 +++++++ gcc/cp/parser.c | 34 +++++++++++++++++--------- gcc/cp/pt.c | 4 +-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/parse/template1.C | 11 +++++++++ 5 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/template1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 02262fdeaa20..f8710774ef30 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2003-01-22 Mark Mitchell <mark@codesourcery.com> + + PR c++/9298 + * parser.c (cp_parser_consume_semicolon_at_end_of_statement): New + function. + (cp_parser_expression_statement): Use it. + (cp_parser_explicit_instantiation): Likewise. + * pt.c (do_decl_instantiation): Improve error handling logic. + 2003-01-22 Mark Mitchell <mark@codesourcery.com> PR c++/9384 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 7f4eeaf67cb1..d64f0b4ef499 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1766,6 +1766,8 @@ static bool cp_parser_skip_to_closing_parenthesis_or_comma (cp_parser *); static void cp_parser_skip_to_end_of_statement PARAMS ((cp_parser *)); +static void cp_parser_consume_semicolon_at_end_of_statement + (cp_parser *); static void cp_parser_skip_to_end_of_block_or_statement PARAMS ((cp_parser *)); static void cp_parser_skip_to_closing_brace @@ -2107,6 +2109,25 @@ cp_parser_skip_to_end_of_statement (parser) } } +/* This function is called at the end of a statement or declaration. + If the next token is a semicolon, it is consumed; otherwise, error + recovery is attempted. */ + +static void +cp_parser_consume_semicolon_at_end_of_statement (cp_parser *parser) +{ + /* Look for the trailing `;'. */ + if (!cp_parser_require (parser, CPP_SEMICOLON, "`;'")) + { + /* If there is additional (erroneous) input, skip to the end of + the statement. */ + cp_parser_skip_to_end_of_statement (parser); + /* If the next token is now a `;', consume it. */ + if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)) + cp_lexer_consume_token (parser->lexer); + } +} + /* Skip tokens until we have consumed an entire block, or until we have consumed a non-nested `;'. */ @@ -5628,15 +5649,7 @@ cp_parser_expression_statement (parser) statement = NULL_TREE; } /* Consume the final `;'. */ - if (!cp_parser_require (parser, CPP_SEMICOLON, "`;'")) - { - /* If there is additional (erroneous) input, skip to the end of - the statement. */ - cp_parser_skip_to_end_of_statement (parser); - /* If the next token is now a `;', consume it. */ - if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)) - cp_lexer_consume_token (parser->lexer); - } + cp_parser_consume_semicolon_at_end_of_statement (parser); return statement; } @@ -8256,8 +8269,7 @@ cp_parser_explicit_instantiation (parser) /* Trun access control back on. */ scope_chain->check_access = flag_access_control; - /* Look for the trailing `;'. */ - cp_parser_require (parser, CPP_SEMICOLON, "`;'"); + cp_parser_consume_semicolon_at_end_of_statement (parser); } /* Parse an explicit-specialization. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9f391ebf0368..ca75cb0b0d65 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10219,9 +10219,9 @@ do_decl_instantiation (tree decl, tree storage) should handle VAR_DECLs as it currently handles FUNCTION_DECLs. */ result = lookup_field (DECL_CONTEXT (decl), DECL_NAME (decl), 0, 0); - if (result && TREE_CODE (result) != VAR_DECL) + if (!result || TREE_CODE (result) != VAR_DECL) { - error ("no matching template for `%D' found", result); + error ("no matching template for `%D' found", decl); return; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1bc745363656..fed915c899aa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2003-01-22 Mark Mitchell <mark@codesourcery.com> + PR c++/9298 + * g++.dg/parse/template1.C: New test. + PR c++/9384 * g++.dg/parse/using1.C: New test. diff --git a/gcc/testsuite/g++.dg/parse/template1.C b/gcc/testsuite/g++.dg/parse/template1.C new file mode 100644 index 000000000000..d7bbb073f812 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/template1.C @@ -0,0 +1,11 @@ +struct CPU { + typedef int (*pfun)(); + + template <pfun step1> + static int dispatch(); +}; + +template<int> +static int foo(); + +template int CPU::dispatch<&template foo<2> > (); // { dg-error "" } -- GitLab