aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mmitchell@gcc.gnu.org>1998-02-12 14:55:02 +0000
committerMark Mitchell <mmitchell@gcc.gnu.org>1998-02-12 14:55:02 +0000
commit3317aae90b39123922aa92f0f10f65212df1699a (patch)
treed39d31d183a285aeb90430f6de9a9f26d2821fe9 /gcc
parent9ca21c0adb7d4de79d72a402914a71bcd38df3a2 (diff)
downloadgcc-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.c6
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C35
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");
+}
+