re PR c++/13451 (Wrong error message with qualified names for member declarations)
PR c++/13451 * parser.c (cp_parser_class_head): Reorder logic to check for invalid qualification. PR c++/13451 * g++.dg/template/class2.C: New test. From-SVN: r75440
This commit is contained in:
parent
02fef8539e
commit
8808159929
|
@ -1,3 +1,9 @@
|
|||
2004-01-05 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/13451
|
||||
* parser.c (cp_parser_class_head): Reorder logic to check for
|
||||
invalid qualification.
|
||||
|
||||
2004-01-04 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/13157
|
||||
|
|
|
@ -11837,6 +11837,35 @@ cp_parser_class_head (cp_parser* parser,
|
|||
else if (invalid_nested_name_p)
|
||||
cp_parser_error (parser,
|
||||
"qualified name does not name a class");
|
||||
else if (nested_name_specifier)
|
||||
{
|
||||
tree scope;
|
||||
/* Figure out in what scope the declaration is being placed. */
|
||||
scope = current_scope ();
|
||||
if (!scope)
|
||||
scope = current_namespace;
|
||||
/* If that scope does not contain the scope in which the
|
||||
class was originally declared, the program is invalid. */
|
||||
if (scope && !is_ancestor (scope, nested_name_specifier))
|
||||
{
|
||||
error ("declaration of `%D' in `%D' which does not "
|
||||
"enclose `%D'", type, scope, nested_name_specifier);
|
||||
type = NULL_TREE;
|
||||
goto done;
|
||||
}
|
||||
/* [dcl.meaning]
|
||||
|
||||
A declarator-id shall not be qualified exception of the
|
||||
definition of a ... nested class outside of its class
|
||||
... [or] a the definition or explicit instantiation of a
|
||||
class member of a namespace outside of its namespace. */
|
||||
if (scope == nested_name_specifier)
|
||||
{
|
||||
pedwarn ("extra qualification ignored");
|
||||
nested_name_specifier = NULL_TREE;
|
||||
num_templates = 0;
|
||||
}
|
||||
}
|
||||
/* An explicit-specialization must be preceded by "template <>". If
|
||||
it is not, try to recover gracefully. */
|
||||
if (at_namespace_scope_p ()
|
||||
|
@ -11880,7 +11909,6 @@ cp_parser_class_head (cp_parser* parser,
|
|||
else
|
||||
{
|
||||
tree class_type;
|
||||
tree scope;
|
||||
|
||||
/* Given:
|
||||
|
||||
|
@ -11903,31 +11931,6 @@ cp_parser_class_head (cp_parser* parser,
|
|||
}
|
||||
}
|
||||
|
||||
/* Figure out in what scope the declaration is being placed. */
|
||||
scope = current_scope ();
|
||||
if (!scope)
|
||||
scope = current_namespace;
|
||||
/* If that scope does not contain the scope in which the
|
||||
class was originally declared, the program is invalid. */
|
||||
if (scope && !is_ancestor (scope, CP_DECL_CONTEXT (type)))
|
||||
{
|
||||
error ("declaration of `%D' in `%D' which does not "
|
||||
"enclose `%D'", type, scope, nested_name_specifier);
|
||||
type = NULL_TREE;
|
||||
goto done;
|
||||
}
|
||||
/* [dcl.meaning]
|
||||
|
||||
A declarator-id shall not be qualified exception of the
|
||||
definition of a ... nested class outside of its class
|
||||
... [or] a the definition or explicit instantiation of a
|
||||
class member of a namespace outside of its namespace. */
|
||||
if (scope == CP_DECL_CONTEXT (type))
|
||||
{
|
||||
pedwarn ("extra qualification ignored");
|
||||
nested_name_specifier = NULL_TREE;
|
||||
}
|
||||
|
||||
maybe_process_partial_specialization (TREE_TYPE (type));
|
||||
class_type = current_class_type;
|
||||
/* Enter the scope indicated by the nested-name-specifier. */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2004-01-05 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/13451
|
||||
* g++.dg/template/class2.C: New test.
|
||||
|
||||
2004-01-05 Nathan Sidwell <nathan@codesourcery.com>
|
||||
Richard Sandiford <rsandifo@redhat.com>
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// PR c++/13451
|
||||
|
||||
template <class T>
|
||||
struct A {
|
||||
struct B;
|
||||
struct A::B { }; // { dg-error "" }
|
||||
};
|
Loading…
Reference in New Issue