* typeck.c (comp_target_types): Fix PMFs.
authorJason Merrill <jason@yorick.cygnus.com>
Thu, 23 Apr 1998 09:34:57 +0000 (09:34 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 23 Apr 1998 09:34:57 +0000 (05:34 -0400)
From-SVN: r19383

gcc/cp/ChangeLog
gcc/cp/typeck.c

index 949da95b65b7ff0124f001e9fc784ee61c013ff0..c6025dffafd3477fd79129790b7113cd4c2ab53c 100644 (file)
@@ -1,3 +1,7 @@
+Thu Apr 23 09:32:58 1998  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * typeck.c (comp_target_types): Fix PMFs.
+
 Wed Apr 22 13:24:48 1998  Mark Mitchell  <mmitchell@usa.net>
 
        * class.c (finish_struct): Set TREE_PRIVATE and TREE_PROTECTED for
index f891b1ef8f033d27895d9227187ecc74d07f5c18..c0b00b0a3e5a12fc1cf0573cf944fb5e95228d7d 100644 (file)
@@ -959,6 +959,9 @@ comp_target_types (ttl, ttr, nptrs)
     return comp_array_types (comp_target_types, ttl, ttr, 0);
   else if (TREE_CODE (ttr) == FUNCTION_TYPE || TREE_CODE (ttr) == METHOD_TYPE)
     {
+      tree argsl, argsr;
+      int saw_contra = 0;
+
       if (pedantic)
        {
          if (comptypes (TREE_TYPE (ttl), TREE_TYPE (ttr), 1) == 0)
@@ -966,12 +969,45 @@ comp_target_types (ttl, ttr, nptrs)
        }
       else
        {
-         if (comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), -1) == 0)
-           return 0;
+         switch (comp_target_types (TREE_TYPE (ttl), TREE_TYPE (ttr), -1))
+           {
+           case 0:
+             return 0;
+           case -1:
+             saw_contra = 1;
+           }
        }
 
-      return comp_target_parms (TYPE_ARG_TYPES (ttl),
-                               TYPE_ARG_TYPES (ttr), 1);
+      argsl = TYPE_ARG_TYPES (ttl);
+      argsr = TYPE_ARG_TYPES (ttr);
+
+      /* Compare 'this' here, not in comp_target_parms.  */
+      if (TREE_CODE (ttr) == METHOD_TYPE)
+       {
+         tree tl = TYPE_METHOD_BASETYPE (ttl);
+         tree tr = TYPE_METHOD_BASETYPE (ttr);
+
+         if (comptypes (tr, tl, 0) == 0)
+           {
+             if (comptypes (tl, tr, 0))
+               saw_contra = 1;
+             else
+               return 0;
+           }
+
+         argsl = TREE_CHAIN (argsl);
+         argsr = TREE_CHAIN (argsr);
+       }
+
+       switch (comp_target_parms (argsl, argsr, 1))
+         {
+         case 0:
+           return 0;
+         case -1:
+           saw_contra = 1;
+         }
+
+       return saw_contra ? -1 : 1;
     }
   /* for C++ */
   else if (TREE_CODE (ttr) == OFFSET_TYPE)