OSDN Git Service

* call.c (reference_binding): Use comptypes when comparing
authormmitchell <mmitchell@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Feb 1998 14:55:02 +0000 (14:55 +0000)
committermmitchell <mmitchell@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 12 Feb 1998 14:55:02 +0000 (14:55 +0000)
TYPE_MAIN_VARIANTS to handle non-canonical array/index types.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@17875 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/call.c
gcc/testsuite/g++.old-deja/g++.pt/memtemp69.C [new file with mode: 0644]

index 18eeb82..d30092e 100644 (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
        {
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 (file)
index 0000000..1893219
--- /dev/null
@@ -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");
+}