diff options
author | Mark Mitchell <mmitchell@gcc.gnu.org> | 1998-02-12 14:55:02 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchell@gcc.gnu.org> | 1998-02-12 14:55:02 +0000 |
commit | 3317aae90b39123922aa92f0f10f65212df1699a (patch) | |
tree | d39d31d183a285aeb90430f6de9a9f26d2821fe9 /gcc | |
parent | 9ca21c0adb7d4de79d72a402914a71bcd38df3a2 (diff) | |
download | gcc-3317aae90b39123922aa92f0f10f65212df1699a.zip gcc-3317aae90b39123922aa92f0f10f65212df1699a.tar.gz gcc-3317aae90b39123922aa92f0f10f65212df1699a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/call.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C | 35 |
2 files changed, 39 insertions, 2 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 18eeb82..d30092e 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 0000000..1893219 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C @@ -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"); +} + |