aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl2.c32
2 files changed, 28 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9f13fc9..8739537 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+1999-08-25 Nathan Sidwell <nathan@acm.org>
+
+ * decl2.c (handle_class_head): Be graceful about additional
+ scope qualifiers. Adjust comments to reflect reality.
+
1999-08-24 Jason Merrill <jason@yorick.cygnus.com>
* call.c (build_conditional_expr): Fix typo.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index ea4dd36..fcdd472 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -5235,19 +5235,33 @@ handle_class_head (aggr, scope, id)
decl = DECL_TEMPLATE_RESULT (id);
else
{
- if (scope)
- {
- cp_error ("`%T' does not have a nested type named `%D'", scope, id);
- return error_mark_node;
- }
+ tree current = current_scope();
+
+ if (current == NULL_TREE)
+ current = current_namespace;
+ if (scope == std_node)
+ scope = global_namespace;
+ if (scope == NULL_TREE)
+ scope = global_namespace;
+ if (scope == current)
+ {
+ /* We've been given AGGR SCOPE::ID, when we're already inside SCOPE.
+ Be nice about it. */
+ if (pedantic)
+ cp_pedwarn ("extra qualification `%T::' on member `%D' ignored",
+ FROB_CONTEXT (scope), id);
+ }
+ else if (scope != global_namespace)
+ cp_error ("`%T' does not have a nested type named `%D'", scope, id);
else
cp_error ("no file-scope type named `%D'", id);
- decl = TYPE_MAIN_DECL (xref_tag (aggr, make_anon_name (), 1));
+ /* Inject it at the current scope. */
+ decl = TYPE_MAIN_DECL (xref_tag (aggr, id, 1));
}
-
- /* This syntax is only allowed when we're defining a type, so we
- enter the SCOPE. */
+
+ /* Enter the SCOPE. If this turns out not to be a definition, the
+ parser must leave the scope. */
push_scope (CP_DECL_CONTEXT (decl));
/* If we see something like: