From: Nathan Sidwell Date: Wed, 25 Aug 1999 12:04:47 +0000 (+0000) Subject: decl2.c (handle_class_head): Be graceful about additional scope qualifiers. X-Git-Tag: prereleases/libstdc++-2.92~11047 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d7f426dc123d4fed0f52271d083436d3769d8d06;p=thirdparty%2Fgcc.git decl2.c (handle_class_head): Be graceful about additional scope qualifiers. * decl2.c (handle_class_head): Be graceful about additional scope qualifiers. Adjust comments to reflect reality. From-SVN: r28856 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9f13fc930474..87395379d78b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +1999-08-25 Nathan Sidwell + + * decl2.c (handle_class_head): Be graceful about additional + scope qualifiers. Adjust comments to reflect reality. + 1999-08-24 Jason Merrill * call.c (build_conditional_expr): Fix typo. diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index ea4dd36bfee0..fcdd4722b256 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: