OSDN Git Service

In gcc/objc/:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 Sep 2010 10:20:11 +0000 (10:20 +0000)
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 28 Sep 2010 10:20:11 +0000 (10:20 +0000)
2010-09-28  Nicola Pero  <nicola.pero@meta-innovation.com>

        Merge from 'apple/trunk' branch on FSF servers.

        2005-07-18  Ziemowit Laski  <zlaski@apple.com>

        Radar 4175534
        * objc-act.c (objc_compare_types): A new silent comparison
        mode (-4), differing from regular comparison (-3) in that
        'false' is returned instead of issuing warnings.

In gcc/testsuite/:
2010-09-28  Nicola Pero  <nicola.pero@meta-innovation.com>

        Merge from 'apple/trunk' branch on FSF servers.

        2005-07-18  Ziemowit Laski  <zlaski@apple.com>

        Radar 4175534
        * obj-c++.dg/method-22.mm: New.

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

gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/method-22.mm [new file with mode: 0644]

index e274a86..b174bcf 100644 (file)
@@ -1,5 +1,16 @@
 2010-09-28  Nicola Pero  <nicola.pero@meta-innovation.com>
 
+       Merge from 'apple/trunk' branch on FSF servers.
+
+       2005-07-18  Ziemowit Laski  <zlaski@apple.com>
+
+       Radar 4175534
+       * objc-act.c (objc_compare_types): A new silent comparison
+       mode (-4), differing from regular comparison (-3) in that
+       'false' is returned instead of issuing warnings.
+       
+2010-09-28  Nicola Pero  <nicola.pero@meta-innovation.com>
+
        * objc-act.c (encode_type): Do not add 'r' with the next runtime.
        (encode_aggregate_within): Reorganized code to be more readable.
        (encode_aggregate_fields): Updated second argument to be 'bool'
index 39f0b5c..ecf3782 100644 (file)
@@ -1143,7 +1143,9 @@ objc_common_type (tree type1, tree type2)
      0         Return value;
      -1                Assignment;
      -2                Initialization;
-     -3                Comparison (LTYP and RTYP may match in either direction).  */
+     -3                Comparison (LTYP and RTYP may match in either direction);
+     -4                Silent comparison (for C++ overload resolution).
+  */
 
 bool
 objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
@@ -1198,8 +1200,9 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
       && !TYPE_HAS_OBJC_INFO (rtyp))
     return false;
 
-  /* Past this point, we are committed to returning 'true' to the caller.
-     However, we can still warn about type and/or protocol mismatches.  */
+  /* Past this point, we are committed to returning 'true' to the caller
+     (unless performing a silent comparison; see below).  However, we can
+     still warn about type and/or protocol mismatches.  */
 
   if (TYPE_HAS_OBJC_INFO (ltyp))
     {
@@ -1253,7 +1256,7 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
       if (!pointers_compatible)
        pointers_compatible = DERIVED_FROM_P (ltyp, rtyp);
 
-      if (!pointers_compatible && argno == -3)
+      if (!pointers_compatible && argno <= -3)
        pointers_compatible = DERIVED_FROM_P (rtyp, ltyp);
     }
 
@@ -1271,11 +1274,17 @@ objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
 
   if (!pointers_compatible)
     {
+      /* The two pointers are not exactly compatible.  Issue a warning, unless
+        we are performing a silent comparison, in which case return 'false'
+        instead.  */
       /* NB: For the time being, we shall make our warnings look like their
         C counterparts.  In the future, we may wish to make them more
         ObjC-specific.  */
       switch (argno)
        {
+       case -4:
+         return false;
+
        case -3:
          warning (0, "comparison of distinct Objective-C types lacks a cast");
          break;
index f56e709..c7bb80b 100644 (file)
@@ -1,3 +1,12 @@
+2010-09-28  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       Merge from 'apple/trunk' branch on FSF servers.
+
+       2005-07-18  Ziemowit Laski  <zlaski@apple.com>
+
+       Radar 4175534
+       * obj-c++.dg/method-22.mm: New.
+       
 2010-09-27  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/rv-lvalue-req.C: New.
diff --git a/gcc/testsuite/obj-c++.dg/method-22.mm b/gcc/testsuite/obj-c++.dg/method-22.mm
new file mode 100644 (file)
index 0000000..583607b
--- /dev/null
@@ -0,0 +1,42 @@
+/* Ensure that overload resolution does not produce warnings as
+   side-effects.  */
+/* { dg-do run } */
+
+#include "../objc-obj-c++-shared/Object1.h"
+#include <stdlib.h>
+
+#define CHECK_IF(E) if(!(E)) abort ()
+
+@interface MyCursor: Object
++ (MyCursor *)crosshairCursor;
+@end
+
+@class MyImage;
+
+class A {
+public:
+    A();
+    
+    int foo(MyImage *);
+    int foo(MyCursor *);
+};
+
+A::A() {}
+int A::foo(MyCursor * c) { return 17; }
+int A::foo(MyImage * i) { return 29; }
+
+@implementation MyCursor
++ (MyCursor *)crosshairCursor {
+  return self;
+}
+@end
+
+int main(void) {
+  A a;
+  
+  int r = a.foo([MyCursor crosshairCursor]);
+
+  CHECK_IF (r == 17);    
+  return 0;
+}
+