OSDN Git Service

cp:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 May 2001 15:00:29 +0000 (15:00 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 18 May 2001 15:00:29 +0000 (15:00 +0000)
PR c++/2526
* decl.c (pushdecl): Adjust error string.
(xref_tag): Adjust friend class injection warning. Remove the
inherited name from the class shadowed scope.
testsuite:
* g++.old-deja/g++.pt/inherit2.C: Remove XFAIL.
* g++.old-deja/g++.pt/crash67.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@42265 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/crash67.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.pt/inherit2.C

index 66540ef..0b59a1e 100644 (file)
@@ -1,3 +1,9 @@
+2001-05-18  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * decl.c (pushdecl): Adjust error string.
+       (xref_tag): Adjust friend class injection warning. Remove the
+       inherited name from the class shadowed scope.
+
 2001-05-17  Mark Mitchell  <mark@codesourcery.com>
 
        * except.c (cp_protect_cleanup_actions): New function.
index ee5c279..7604401 100644 (file)
@@ -3938,7 +3938,8 @@ pushdecl (x)
          else if (t == wchar_decl_node)
            {
              if (pedantic && ! DECL_IN_SYSTEM_HEADER (x))
-               cp_pedwarn ("redeclaration of wchar_t as `%T'", TREE_TYPE (x));
+               cp_pedwarn ("redeclaration of `wchar_t' as `%T'",
+                           TREE_TYPE (x));
 
              /* Throw away the redeclaration.  */
              return t;
@@ -12535,16 +12536,26 @@ xref_tag (code_type_node, name, globalize)
   if (t && globalize && TREE_CODE (t) == TYPENAME_TYPE)
     {
       static int explained;
-
-      cp_warning ("`%s %T' declares a new type at namespace scope;\n\
-to refer to the inherited type, say `%s %T::%T'%s",
-                 tag_name (tag_code), name, tag_name (tag_code),
-                 constructor_name (current_class_type), TYPE_IDENTIFIER (t),
-                 (!explained ? "\n\
-(names from dependent base classes are not visible to unqualified name lookup)"
-                  : ""));
-
-      explained = 1;
+      tree shadowed;
+
+      cp_warning ("`%s %T' declares a new type at namespace scope",
+                 tag_name (tag_code), name);
+      if (!explained++)
+       cp_warning ("  names from dependent base classes are not visible to unqualified name lookup - to refer to the inherited type, say `%s %T::%T'%s",
+                   tag_name (tag_code),
+                   constructor_name (current_class_type),
+                   TYPE_IDENTIFIER (t));
+
+      /* We need to remove the class scope binding for the
+         TYPENAME_TYPE as otherwise poplevel_class gets confused. */
+      for (shadowed = b->class_shadowed;
+          shadowed;
+          shadowed = TREE_CHAIN (shadowed))
+       if (TREE_TYPE (shadowed) == TYPE_NAME (t))
+         {
+           TREE_PURPOSE (shadowed) = NULL_TREE;
+           break;
+         }
     }
 
   if (t && TREE_CODE (t) != code && TREE_CODE (t) != TEMPLATE_TYPE_PARM
index 25dca8c..cdfd501 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-18  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/inherit2.C: Remove XFAIL.
+       * g++.old-deja/g++.pt/crash67.C: New test.
+
 2001-05-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
 
        * g++.old-deja/g++.other/debug9.C: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash67.C b/gcc/testsuite/g++.old-deja/g++.pt/crash67.C
new file mode 100644 (file)
index 0000000..e8fc214
--- /dev/null
@@ -0,0 +1,20 @@
+// Build don't link:
+// Special g++ Options: 
+// 
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 May 2001 <nathan@codesourcery.com>
+
+// Bug 2526. We ICE'd after diagnosing dependant name confusion in
+// friendliness when not being pedantic.
+
+template<typename T>
+struct B
+{
+  typedef B<T> Mother;
+};
+
+template<typename T>
+struct D : B<T>
+{
+  friend class Mother; // WARNING - defines namespace class
+};
index 628f590..5198a64 100644 (file)
@@ -1,7 +1,7 @@
 // Test that we warn about unqualified references to implicit typenames.
-// Bug: g++ is confused by the binding for ::AN and crashes.
+
 // Special g++ Options:
-// excess errors test - XFAIL *-*-*
+// Build don't link:
 
 template <class T> struct A {
   struct AA { };