]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/13451 (Wrong error message with qualified names for member declarations)
authorMark Mitchell <mark@codesourcery.com>
Mon, 5 Jan 2004 19:54:35 +0000 (19:54 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 5 Jan 2004 19:54:35 +0000 (19:54 +0000)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/class2.C [new file with mode: 0644]

index e3baeebd3df0193f047e23af7fb65b17cc6406ba..79af88e2e9826fba9a724d5fe64525f064951ae0 100644 (file)
@@ -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
index 76de7a0817f88f14376c27ed774bb2a4bccadbed..9a16f826d34668639e5d13931bc0a9261a685733 100644 (file)
@@ -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.  */
index 7e34508659c904ef58a42f40eeedaa35d4b7f0d2..fc4e462beb357b1837ec32debe25555d52b6c6f9 100644 (file)
@@ -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>
 
diff --git a/gcc/testsuite/g++.dg/template/class2.C b/gcc/testsuite/g++.dg/template/class2.C
new file mode 100644 (file)
index 0000000..4144997
--- /dev/null
@@ -0,0 +1,7 @@
+// PR c++/13451
+
+template <class T>
+struct A {
+  struct B;
+  struct A::B { }; // { dg-error "" }
+};