diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a0e74051040..90110ded59f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-02-28 Jason Merrill + + PR c++/56243 + * call.c (build_over_call): Avoid virtual lookup in a template. + 2013-02-27 Jason Merrill PR c++/56358 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 7c414217f05..4eb38ec73e9 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7033,7 +7033,10 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) if (!already_used) mark_used (fn); - if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0) + if (DECL_VINDEX (fn) && (flags & LOOKUP_NONVIRTUAL) == 0 + /* Don't mess with virtual lookup in fold_non_dependent_expr; virtual + functions can't be constexpr. */ + && !in_template_function ()) { tree t; tree binfo = lookup_base (TREE_TYPE (TREE_TYPE (argarray[0])), diff --git a/gcc/testsuite/g++.dg/template/virtual4.C b/gcc/testsuite/g++.dg/template/virtual4.C new file mode 100644 index 00000000000..a2c7420b402 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/virtual4.C @@ -0,0 +1,30 @@ +// PR c++/56243 + +struct A +{ + virtual int String (); +}; + +struct F: A { }; + +struct G +{ + F value; +}; + +struct D +{ + template + void Verify() + { + G x; + F& name = x.value; + name.String(); + } +}; + +int main() +{ + D d; + d.Verify<42>(); +}