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:
parent
8f9f2d0f2b
commit
862e1e62fc
6 changed files with 67 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
23
gcc/testsuite/g++.dg/lookup/friend9.C
Normal file
23
gcc/testsuite/g++.dg/lookup/friend9.C
Normal 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;
|
||||
|
||||
}
|
11
gcc/testsuite/g++.dg/template/repo5.C
Normal file
11
gcc/testsuite/g++.dg/template/repo5.C
Normal 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 () {}
|
Loading…
Add table
Reference in a new issue