Commit e58d4228 by Jason Merrill Committed by Jason Merrill

re PR c++/51889 (can't override a using-declaration in a template)

	PR c++/51889
	* class.c (finish_struct): Call add_method here for function usings.
	* semantics.c (finish_member_declaration): Not here.

From-SVN: r183304
parent aad038ca
2012-01-19 Jason Merrill <jason@redhat.com>
PR c++/51889
* class.c (finish_struct): Call add_method here for function usings.
* semantics.c (finish_member_declaration): Not here.
2012-01-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51225
......
......@@ -6195,6 +6195,18 @@ finish_struct (tree t, tree attributes)
if (DECL_PURE_VIRTUAL_P (x))
VEC_safe_push (tree, gc, CLASSTYPE_PURE_VIRTUALS (t), x);
complete_vars (t);
/* We need to add the target functions to the CLASSTYPE_METHOD_VEC if
an enclosing scope is a template class, so that this function be
found by lookup_fnfields_1 when the using declaration is not
instantiated yet. */
for (x = TYPE_FIELDS (t); x; x = DECL_CHAIN (x))
if (TREE_CODE (x) == USING_DECL)
{
tree fn = strip_using_decl (x);
if (is_overloaded_fn (fn))
for (; fn; fn = OVL_NEXT (fn))
add_method (t, OVL_CURRENT (fn), x);
}
/* Remember current #pragma pack value. */
TYPE_PRECISION (t) = maximum_field_alignment;
......
......@@ -2671,20 +2671,6 @@ finish_member_declaration (tree decl)
{
if (TREE_CODE (decl) == USING_DECL)
{
/* We need to add the target functions to the
CLASSTYPE_METHOD_VEC if an enclosing scope is a template
class, so that this function be found by lookup_fnfields_1
when the using declaration is not instantiated yet. */
tree target_decl = strip_using_decl (decl);
if (dependent_type_p (current_class_type)
&& is_overloaded_fn (target_decl))
{
tree t = target_decl;
for (; t; t = OVL_NEXT (t))
add_method (current_class_type, OVL_CURRENT (t), decl);
}
/* For now, ignore class-scope USING_DECLS, so that
debugging backends do not see them. */
DECL_IGNORED_P (decl) = 1;
......
2012-01-19 Jason Merrill <jason@redhat.com>
PR c++/51889
* g++.dg/inherit/using7.C: New.
2012-01-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/37997
......
// PR c++/51889
struct A {
void f();
};
template <class T>
struct B: A
{
using A::f;
void f();
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment