mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-18 02:14:31 +08:00
re PR c++/15503 (nested template problem)
PR c++/15503 * parser.c (cp_parser_mem_initializer_id): Gracefully reject 'typename', and accept 'template'. PR c++/15503 * g++.dg/template/meminit2.C: New test. From-SVN: r82660
This commit is contained in:
parent
ad94c84603
commit
8a83a69363
@ -1,3 +1,9 @@
|
|||||||
|
2004-06-06 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR c++/15503
|
||||||
|
* parser.c (cp_parser_mem_initializer_id): Gracefully reject
|
||||||
|
'typename', and accept 'template'.
|
||||||
|
|
||||||
2004-06-03 Andrew Pinski <pinskia@physics.uc.edu>
|
2004-06-03 Andrew Pinski <pinskia@physics.uc.edu>
|
||||||
Jan Hubicka <jh@suse.cz>
|
Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
|
@ -7383,8 +7383,16 @@ cp_parser_mem_initializer_id (cp_parser* parser)
|
|||||||
{
|
{
|
||||||
bool global_scope_p;
|
bool global_scope_p;
|
||||||
bool nested_name_specifier_p;
|
bool nested_name_specifier_p;
|
||||||
|
bool template_p = false;
|
||||||
tree id;
|
tree id;
|
||||||
|
|
||||||
|
/* `typename' is not allowed in this context ([temp.res]). */
|
||||||
|
if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TYPENAME))
|
||||||
|
{
|
||||||
|
error ("keyword `typename' not allowed in this context (a qualified "
|
||||||
|
"member initializer is implicitly a type)");
|
||||||
|
cp_lexer_consume_token (parser->lexer);
|
||||||
|
}
|
||||||
/* Look for the optional `::' operator. */
|
/* Look for the optional `::' operator. */
|
||||||
global_scope_p
|
global_scope_p
|
||||||
= (cp_parser_global_scope_opt (parser,
|
= (cp_parser_global_scope_opt (parser,
|
||||||
@ -7409,12 +7417,14 @@ cp_parser_mem_initializer_id (cp_parser* parser)
|
|||||||
/*type_p=*/true,
|
/*type_p=*/true,
|
||||||
/*is_declaration=*/true)
|
/*is_declaration=*/true)
|
||||||
!= NULL_TREE);
|
!= NULL_TREE);
|
||||||
|
if (nested_name_specifier_p)
|
||||||
|
template_p = cp_parser_optional_template_keyword (parser);
|
||||||
/* If there is a `::' operator or a nested-name-specifier, then we
|
/* If there is a `::' operator or a nested-name-specifier, then we
|
||||||
are definitely looking for a class-name. */
|
are definitely looking for a class-name. */
|
||||||
if (global_scope_p || nested_name_specifier_p)
|
if (global_scope_p || nested_name_specifier_p)
|
||||||
return cp_parser_class_name (parser,
|
return cp_parser_class_name (parser,
|
||||||
/*typename_keyword_p=*/true,
|
/*typename_keyword_p=*/true,
|
||||||
/*template_keyword_p=*/false,
|
/*template_keyword_p=*/template_p,
|
||||||
/*type_p=*/false,
|
/*type_p=*/false,
|
||||||
/*check_dependency_p=*/true,
|
/*check_dependency_p=*/true,
|
||||||
/*class_head_p=*/false,
|
/*class_head_p=*/false,
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2004-06-06 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||||
|
|
||||||
|
PR c++/15503
|
||||||
|
* g++.dg/template/meminit2.C: New test.
|
||||||
|
|
||||||
2004-06-04 Paolo Bonzini <bonzini@gnu.org>
|
2004-06-04 Paolo Bonzini <bonzini@gnu.org>
|
||||||
|
|
||||||
PR target/15822
|
PR target/15822
|
||||||
|
21
gcc/testsuite/g++.dg/template/meminit2.C
Normal file
21
gcc/testsuite/g++.dg/template/meminit2.C
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// { dg-do compile }
|
||||||
|
// Origin: Mark Anders <mark dot a dot anders at intel dot com>
|
||||||
|
// PR c++/15503: disambiguators in base classes and mem-initializers
|
||||||
|
|
||||||
|
template <typename K1> struct O {
|
||||||
|
template <typename K2> struct I {};
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct A : typename O<T>::template I<int> { // { dg-error "keyword `typename' not allowed" }
|
||||||
|
A() : typename O<T>::template I<int>() // { dg-error "keyword `typename' not allowed" }
|
||||||
|
{};
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct B : O<T>::template I<int> {
|
||||||
|
B() : O<T>::I<int>() // { dg-error "used as template|it is a template" "" }
|
||||||
|
{};
|
||||||
|
};
|
||||||
|
|
||||||
|
// { dg-bogus "end of input" "bogus token skipping in the parser" { xfail *-*-* } 17 }
|
Loading…
Reference in New Issue
Block a user