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:
parent
b4ec7fc7f0
commit
e086073238
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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 "" }
|
Loading…
Reference in New Issue