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>
|
||||
Jan Hubicka <jh@suse.cz>
|
||||
|
||||
|
@ -7383,8 +7383,16 @@ cp_parser_mem_initializer_id (cp_parser* parser)
|
||||
{
|
||||
bool global_scope_p;
|
||||
bool nested_name_specifier_p;
|
||||
bool template_p = false;
|
||||
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. */
|
||||
global_scope_p
|
||||
= (cp_parser_global_scope_opt (parser,
|
||||
@ -7409,12 +7417,14 @@ cp_parser_mem_initializer_id (cp_parser* parser)
|
||||
/*type_p=*/true,
|
||||
/*is_declaration=*/true)
|
||||
!= 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
|
||||
are definitely looking for a class-name. */
|
||||
if (global_scope_p || nested_name_specifier_p)
|
||||
return cp_parser_class_name (parser,
|
||||
/*typename_keyword_p=*/true,
|
||||
/*template_keyword_p=*/false,
|
||||
/*template_keyword_p=*/template_p,
|
||||
/*type_p=*/false,
|
||||
/*check_dependency_p=*/true,
|
||||
/*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>
|
||||
|
||||
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