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))
|
else if (! expr || ! real_lvalue_p (expr))
|
||||||
lvalue = 0;
|
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)
|
|| (IS_AGGR_TYPE (to) && IS_AGGR_TYPE (from)
|
||||||
&& DERIVED_FROM_P (to, from)));
|
&& DERIVED_FROM_P (to, from)));
|
||||||
|
|
||||||
@ -3252,7 +3253,8 @@ reference_binding (rto, rfrom, expr, flags)
|
|||||||
{
|
{
|
||||||
conv = build1 (IDENTITY_CONV, from, expr);
|
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);
|
conv = build_conv (REF_BIND, rto, conv);
|
||||||
else
|
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