re PR c++/18757 (ICE (on invalid) in get_innermost_template_args)
gcc/cp/ChangeLog: PR c++/18757 PR c++/19366 PR c++/19499 * parser.c (cp_parser_template_id): Revert 2004-12-09's patch. Issue an error when creating the template id. * pt.c (fn_type_unification): Return early if the explicit template arg list is an error_mark_node. gcc/testsuite/ChangeLog: * g++.dg/parse/typename7.C: Adjust error messages. From-SVN: r94520
This commit is contained in:
parent
7d793e369d
commit
c8a7ed431a
|
@ -1,3 +1,13 @@
|
|||
2005-02-01 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
PR c++/18757
|
||||
PR c++/19366
|
||||
PR c++/19499
|
||||
* parser.c (cp_parser_template_id): Revert 2004-12-09's patch.
|
||||
Issue an error when creating the template id.
|
||||
* pt.c (fn_type_unification): Return early if the explicit
|
||||
template arg list is an error_mark_node.
|
||||
|
||||
2005-01-31 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* decl.c (build_enumerator): Do not issue duplicate error messages
|
||||
|
|
|
@ -8514,7 +8514,7 @@ cp_parser_template_id (cp_parser *parser,
|
|||
error messages about problems during instantiation of the
|
||||
template. Do so only if parsing succeeded, otherwise we may
|
||||
silently accept template arguments with syntax errors. */
|
||||
if (start_of_id && !cp_parser_error_occurred (parser))
|
||||
if (start_of_id)
|
||||
{
|
||||
cp_token *token = cp_lexer_token_at (parser->lexer, start_of_id);
|
||||
|
||||
|
@ -8525,6 +8525,13 @@ cp_parser_template_id (cp_parser *parser,
|
|||
|
||||
/* Purge all subsequent tokens. */
|
||||
cp_lexer_purge_tokens_after (parser->lexer, start_of_id);
|
||||
|
||||
/* ??? Can we actually assume that, if template_id ==
|
||||
error_mark_node, we will have issued a diagnostic to the
|
||||
user, as opposed to simply marking the tentative parse as
|
||||
failed? */
|
||||
if (cp_parser_error_occurred (parser) && template_id != error_mark_node)
|
||||
error ("parse error in template argument list");
|
||||
}
|
||||
|
||||
pop_deferring_access_checks ();
|
||||
|
|
|
@ -9123,6 +9123,9 @@ fn_type_unification (tree fn,
|
|||
tree converted_args;
|
||||
bool incomplete;
|
||||
|
||||
if (explicit_targs == error_mark_node)
|
||||
return 1;
|
||||
|
||||
converted_args
|
||||
= (coerce_template_parms (DECL_INNERMOST_TEMPLATE_PARMS (fn),
|
||||
explicit_targs, NULL_TREE, tf_none,
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2005-02-01 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* g++.dg/parse/typename7.C: Adjust error messages.
|
||||
|
||||
2005-01-31 Jeff Law <law@redhat.com>
|
||||
|
||||
* gcc.c-torture/execute/20050131-1.c: New test.
|
||||
|
|
|
@ -9,23 +9,23 @@ struct A
|
|||
{
|
||||
template<typename> void foo(int);
|
||||
template<typename T> void bar(T t) {
|
||||
this->foo<typename T>(t); } // { dg-error "expected" }
|
||||
this->foo<typename T>(t); } // { dg-error "expected|parse error|no matching" }
|
||||
template<typename T> void bad(T t) {
|
||||
foo<typename T>(t); } // { dg-error "expected" }
|
||||
foo<typename T>(t); } // { dg-error "expected|parse error" }
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct B
|
||||
{
|
||||
void bar(T t) {
|
||||
A().bar<typename T>(t); } // { dg-error "expected" }
|
||||
A().bar<typename T>(t); } // { dg-error "expected|parse error|no matching" }
|
||||
void bad(T t) {
|
||||
B<typename T>::bar(t); } // { dg-error "invalid|not a template" }
|
||||
};
|
||||
|
||||
void baz()
|
||||
{
|
||||
A().bar(0);
|
||||
A().bad(0);
|
||||
B<int>().bar(0);
|
||||
A().bar(0);
|
||||
A().bad(0);
|
||||
B<int>().bar(0);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue