diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 18eeb82b754..d30092eff9a 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -3242,7 +3242,8 @@ reference_binding (rto, rfrom, expr, flags) else if (! expr || ! real_lvalue_p (expr)) lvalue = 0; - related = (TYPE_MAIN_VARIANT (to) == TYPE_MAIN_VARIANT (from) + related = (comptypes (TYPE_MAIN_VARIANT (to), + TYPE_MAIN_VARIANT (from), 1) || (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from) && DERIVED_FROM_P (to, from))); @@ -3252,7 +3253,8 @@ reference_binding (rto, rfrom, expr, flags) { conv = build1 (IDENTITY_CONV, from, expr); - if (TYPE_MAIN_VARIANT (to) == TYPE_MAIN_VARIANT (from)) + if (comptypes (TYPE_MAIN_VARIANT (to), + TYPE_MAIN_VARIANT (from), 1)) conv = build_conv (REF_BIND, rto, conv); else { diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C new file mode 100644 index 00000000000..18932194a27 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C @@ -0,0 +1,35 @@ +struct S +{ + template + void f(T (&i)[7]) + {} + + void g() + { + int i[] = {1, 2, 3, 4, 5, 6, 7}; + f(i); + int j[7]; + f(j); + } +}; + +struct foo { + template + static T* array_end(T(&array)[N]) { return &array[N]; } +}; + +struct X +{ + template + void f(const T1&) {} +}; + +main(int ac, char* av[]) { + S s; + s.g(); + int i[] = {1,2,3,4,5}; + int* e = foo::array_end(i); + X x; + x.f("hello"); +} +