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:
parent
9e71c818a1
commit
2b0cbc5d55
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
20
gcc/testsuite/g++.old-deja/g++.pt/crash67.C
Normal file
20
gcc/testsuite/g++.old-deja/g++.pt/crash67.C
Normal 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
|
||||
};
|
@ -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 { };
|
||||
|
Loading…
Reference in New Issue
Block a user