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
This commit is contained in:
Mark Mitchell 2003-01-22 22:24:30 +00:00 committed by Mark Mitchell
parent b4ec7fc7f0
commit e086073238
5 changed files with 48 additions and 13 deletions

View File

@ -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

View File

@ -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.

View File

@ -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;
}
}

View File

@ -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.

View File

@ -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 "" }