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:
Mark Mitchell 1998-02-12 14:55:02 +00:00
parent 9ca21c0adb
commit 3317aae90b
2 changed files with 39 additions and 2 deletions

View File

@ -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
{

View 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");
}