Commit 7628dc54 by Fabien Chêne

re PR c++/11750 (class scope using-declaration lookup not implemented)

gcc/testsuite/ChangeLog

2012-11-14  Fabien Chêne  <fabien@gcc.gnu.org>

	PR c++/11750
	* g++.dg/inherit/vitual9.C: New.

gcc/cp/ChangeLog

2012-11-14  Fabien Chêne  <fabien@gcc.gnu.org>

	PR c++/11750
	* call.c (build_new_method_call_1): Check that the instance type
	and the function context are the same before setting the flag
	LOOKUP_NONVIRTUAL.

From-SVN: r193504
parent ccd025e1
2012-11-14 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/11750
* call.c (build_new_method_call_1): Check that the instance type
and the function context are the same before setting the flag
LOOKUP_NONVIRTUAL.
2012-11-13 Sriraman Tallam <tmsriram@google.com>
* class.c (mark_versions_used): Remove.
......
......@@ -7652,9 +7652,15 @@ build_new_method_call_1 (tree instance, tree fns, VEC(tree,gc) **args,
}
else
{
/* Optimize away vtable lookup if we know that this function
can't be overridden. */
/* Optimize away vtable lookup if we know that this
function can't be overridden. We need to check if
the context and the instance type are the same,
actually FN might be defined in a different class
type because of a using-declaration. In this case, we
do not want to perform a non-virtual call. */
if (DECL_VINDEX (fn) && ! (flags & LOOKUP_NONVIRTUAL)
&& same_type_ignoring_top_level_qualifiers_p
(DECL_CONTEXT (fn), TREE_TYPE (instance))
&& resolves_to_fixed_type_p (instance, 0))
flags |= LOOKUP_NONVIRTUAL;
if (explicit_targs)
......
2012-11-14 Fabien Chêne <fabien@gcc.gnu.org>
PR c++/11750
* call.c (build_new_method_call_1): Check that the instance type
and the function context are the same before setting the flag
LOOKUP_NONVIRTUAL.
2012-11-13 Sriraman Tallam <tmsriram@google.com>
* testsuite/g++.dg/mv4.C: Add require ifunc. Change error message.
......
// { dg-do run }
// PR c++/11750
struct A
{
virtual void f() const { __builtin_abort(); }
virtual void g() {}
};
struct B : virtual A
{
virtual void f() const {}
virtual void g() { __builtin_abort(); }
};
struct C : B, virtual A
{
using A::f;
using A::g;
};
int main()
{
C c;
c.f(); // call B::f
C c2;
c2.C::g(); // call A::g
C* c3 = &c;
c3->f(); // call B::f
C& c4 = c;
c4.f(); // call B::f
C const* c5 = &c;
c5->f(); // call B::f
C** c6 = &c3;
(*c6)->f(); // call B::f
C const& c7 = c;
c7.f(); // call B::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