call.c (reference_binding): Use comptypes when comparing TYPE_MAIN_VARIANTS to handle non-canonical...
* call.c (reference_binding): Use comptypes when comparing TYPE_MAIN_VARIANTS to handle non-canonical array/index types. From-SVN: r17875
This commit is contained in:
parent
9ca21c0adb
commit
3317aae90b
@ -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
|
||||
{
|
||||
|
35
gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C
Normal file
35
gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C
Normal file
@ -0,0 +1,35 @@
|
||||
struct S
|
||||
{
|
||||
template <class T>
|
||||
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 <typename T, int N>
|
||||
static T* array_end(T(&array)[N]) { return &array[N]; }
|
||||
};
|
||||
|
||||
struct X
|
||||
{
|
||||
template <class T1>
|
||||
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");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user