re PR c++/25492 (friend class nested in derived class problem)

PR c++/25492
	* name-lookup.c (push_class_level_binding): When a derived class
	provides a type binding, eliminate any type binding from a base
	class. 
	PR c++/25625
	* repo.c (repo_emit_p): Always instantiate static data members
	initialized by constant expressions, so that there values are
	available.
	PR c++/25492
	* g++.dg/lookup/friend9.C: New test.
	PR c++/25625
	* g++.dg/template/repo5.C: New test.

From-SVN: r109307
This commit is contained in:
Mark Mitchell 2006-01-04 01:04:51 +00:00 committed by Mark Mitchell
parent 8f9f2d0f2b
commit 862e1e62fc
6 changed files with 67 additions and 1 deletions

View file

@ -1,3 +1,15 @@
2006-01-03 Mark Mitchell <mark@codesourcery.com>
PR c++/25492
* name-lookup.c (push_class_level_binding): When a derived class
provides a type binding, eliminate any type binding from a base
class.
PR c++/25625
* repo.c (repo_emit_p): Always instantiate static data members
initialized by constant expressions, so that there values are
available.
2006-01-02 Mark Mitchell <mark@codesourcery.com>
PR c++/25635

View file

@ -2669,7 +2669,13 @@ push_class_level_binding (tree name, tree x)
INHERITED_VALUE_BINDING_P (binding) = 0;
}
else
old_decl = bval;
{
old_decl = bval;
/* Any inherited type declaration is hidden by the type
declaration in the derived class. */
if (TREE_CODE (x) == TYPE_DECL && DECL_ARTIFICIAL (x))
binding->type = NULL_TREE;
}
}
else if (TREE_CODE (x) == OVERLOAD && is_overloaded_fn (bval))
old_decl = bval;

View file

@ -298,6 +298,12 @@ repo_emit_p (tree decl)
&& (!TYPE_LANG_SPECIFIC (type)
|| !CLASSTYPE_TEMPLATE_INSTANTIATION (type)))
return 2;
/* Static data members initialized by constant expressions must
be processed where needed so that their definitions are
available. */
if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
&& DECL_CLASS_SCOPE_P (decl))
return 2;
}
else if (!DECL_TEMPLATE_INSTANTIATION (decl))
return 2;

View file

@ -1,3 +1,11 @@
2006-01-03 Mark Mitchell <mark@codesourcery.com>
PR c++/25492
* g++.dg/lookup/friend9.C: New test.
PR c++/25625
* g++.dg/template/repo5.C: New test.
2006-01-03 Steven G. Kargl <kargls@comcast.net>
PR fortran/25101

View file

@ -0,0 +1,23 @@
// PR c++/25492
class Base {
public:
class Nested {};
};
class Derived:public Base {
public:
class Nested {
public:
void m();
};
class AnotherNested {
friend class Nested;
AnotherNested() {}
};
};
void Derived::Nested::m() {
Derived::AnotherNested instance;
}

View file

@ -0,0 +1,11 @@
// PR c++/25625
// { dg-options "-frepo" }
template< typename T, T N > struct integral_c {
static const T value = N;
typedef integral_c< T, value + 1 > next;
};
template< typename T, T N > T const integral_c< T, N >::value;
integral_c<int,0> a;
int main () {}