aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2001-05-18 15:00:29 +0000
committerNathan Sidwell <nathan@codesourcery.com>2001-05-18 15:00:29 +0000
commitec3d0e7b2d1a1aa3d89998b157849490de27dc79 (patch)
treedc7bbc9a1a18237b1f75c2012559e6a9f93a2cdf
parentc0654862900f6739fbb582ff746af65fd6593459 (diff)
cp:
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: https://gcc.gnu.org/svn/gcc/trunk@42265 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl.c33
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/crash67.C20
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/inherit2.C4
5 files changed, 55 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 66540efc902..0b59a1e1d55 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index ee5c279a3f6..760440125a0 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 25dca8c90d2..cdfd501c68c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..e8fc2145ae5
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/crash67.C
@@ -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
+};
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/inherit2.C b/gcc/testsuite/g++.old-deja/g++.pt/inherit2.C
index 628f590e10f..5198a6436e2 100644
--- a/gcc/testsuite/g++.old-deja/g++.pt/inherit2.C
+++ b/gcc/testsuite/g++.old-deja/g++.pt/inherit2.C
@@ -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 { };