From: mmitchel Date: Wed, 4 Jan 2006 01:04:51 +0000 (+0000) Subject: PR c++/25492 X-Git-Tag: upstream/4.9.2~56715 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b3cee19984bb007465ff58ed42c37cafc45c6219;p=platform%2Fupstream%2Flinaro-gcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@109307 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4c03812..9102cbc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2006-01-03 Mark Mitchell + + 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 PR c++/25635 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index dcd20f7..ec662e6 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -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; diff --git a/gcc/cp/repo.c b/gcc/cp/repo.c index d2fae3e..ad01010 100644 --- a/gcc/cp/repo.c +++ b/gcc/cp/repo.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9d4355c..e02c3c7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2006-01-03 Mark Mitchell + + 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 PR fortran/25101 diff --git a/gcc/testsuite/g++.dg/lookup/friend9.C b/gcc/testsuite/g++.dg/lookup/friend9.C new file mode 100644 index 0000000..caf685c --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/friend9.C @@ -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; + +} diff --git a/gcc/testsuite/g++.dg/template/repo5.C b/gcc/testsuite/g++.dg/template/repo5.C new file mode 100644 index 0000000..5b76f43 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/repo5.C @@ -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 a; + +int main () {}