re PR c++/2526 (internal compiler error (version 2.95.3 and 3.0))

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.

From-SVN: r42265
This commit is contained in:
Nathan Sidwell 2001-05-18 15:00:29 +00:00 committed by Nathan Sidwell
parent 9e71c818a1
commit 2b0cbc5d55
5 changed files with 53 additions and 11 deletions

View 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.

View 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;
tree shadowed;
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)"
: ""));
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));
explained = 1;
/* 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

View 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.

View File

@ -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
};

View 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 { };