In gcc/objc/: 2011-01-02 Nicola Pero <nicola.pero@meta-innovation.com>
authorNicola Pero <nicola.pero@meta-innovation.com>
Sun, 2 Jan 2011 10:19:42 +0000 (10:19 +0000)
committerNicola Pero <nicola@gcc.gnu.org>
Sun, 2 Jan 2011 10:19:42 +0000 (10:19 +0000)
In gcc/objc/:
2011-01-02  Nicola Pero  <nicola.pero@meta-innovation.com>

* objc-act.c (check_that_protocol_is_defined): New.
(lookup_protocol): Call check_that_protocol_is_defined.

In gcc/testsuite/:
2011-01-02  Nicola Pero  <nicola.pero@meta-innovation.com>

* objc.dg/protocol-forward-1.m: Removed TODO.
* objc.dg/protocol-forward-2.m: New.
* obj-c++.dg/protocol-forward-2.mm: Removed TODO.
* obj-c++.dg/protocol-forward-2.mm: New.

From-SVN: r168398

gcc/objc/ChangeLog
gcc/objc/objc-act.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/protocol-forward-1.mm
gcc/testsuite/obj-c++.dg/protocol-forward-2.mm [new file with mode: 0644]
gcc/testsuite/objc.dg/protocol-forward-1.m
gcc/testsuite/objc.dg/protocol-forward-2.m [new file with mode: 0644]

index 12536a0372482ac3e6a5655fb111fae87747802f..7a9387f5fb183120b4df81baab7f4bb8dcb3d4d4 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-02  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc-act.c (check_that_protocol_is_defined): New.
+       (lookup_protocol): Call check_that_protocol_is_defined.
+
 2010-12-30  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc-act.c (objc_types_are_equivalent): Fixed comparing protocol
index a37f3d91457cbf84539e0782b2e65ef7a5517951..b65b928060d1c85c7e2d4367a2c96440c2b3f912 100644 (file)
@@ -10929,11 +10929,30 @@ add_protocol (tree protocol)
   return protocol_chain;
 }
 
+/* Check that a protocol is defined, and, recursively, that all
+   protocols that this protocol conforms to are defined too.  */
+static void
+check_that_protocol_is_defined (tree protocol)
+{
+  if (!PROTOCOL_DEFINED (protocol))
+    warning (0, "definition of protocol %qE not found",
+            PROTOCOL_NAME (protocol));
+
+  /* If the protocol itself conforms to other protocols, check them
+     too, recursively.  */
+  if (PROTOCOL_LIST (protocol))
+    {
+      tree p;
+
+      for (p = PROTOCOL_LIST (p); p; p = TREE_CHAIN (p))
+       check_that_protocol_is_defined (TREE_VALUE (p));
+    }
+}
+
 /* Looks up a protocol.  If 'warn_if_deprecated' is true, a warning is
    emitted if the protocol is deprecated.  If 'definition_required' is
    true, a warning is emitted if a full @protocol definition has not
    been seen.  */
-
 static tree
 lookup_protocol (tree ident, bool warn_if_deprecated, bool definition_required)
 {
@@ -10951,9 +10970,8 @@ lookup_protocol (tree ident, bool warn_if_deprecated, bool definition_required)
                     PROTOCOL_NAME (chain));
          }
 
-       if (definition_required && !PROTOCOL_DEFINED (chain))
-         warning (0, "definition of protocol %qE not found",
-                  PROTOCOL_NAME (chain));
+       if (definition_required)
+         check_that_protocol_is_defined (chain);
 
        return chain;
       }
index 8c037b2231e3b6bd7804bbfce5e3323a42be81ca..43d9687d97cd96bf2619b641fc5b5b09090fb7cb 100644 (file)
@@ -1,3 +1,10 @@
+2011-01-02  Nicola Pero  <nicola.pero@meta-innovation.com>
+
+       * objc.dg/protocol-forward-1.m: Removed TODO.
+       * objc.dg/protocol-forward-2.m: New.
+       * obj-c++.dg/protocol-forward-2.mm: Removed TODO.
+       * obj-c++.dg/protocol-forward-2.mm: New.
+
 2011-01-01  Kai Tietz  <kai.tietz@onevision.com>
 
        PR target/38662
index 17d9044ab3aba0667a1890b40de3b90f346e6630..03c7ae065da8cb8716e786aa756a2e357acd9d0e 100644 (file)
@@ -25,6 +25,3 @@
 @protocol MyProtocol3 <MyProtocol> /* Ok */
 @end
 
-/* TODO: I guess if MyProtocol3 is now used in an @interface, we
-   should check that all the protocols it references are defined
-   too ?  */
diff --git a/gcc/testsuite/obj-c++.dg/protocol-forward-2.mm b/gcc/testsuite/obj-c++.dg/protocol-forward-2.mm
new file mode 100644 (file)
index 0000000..9217ca8
--- /dev/null
@@ -0,0 +1,95 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
+/* { dg-do compile } */
+
+/* Test that all protocols appearing in @interface declarations are
+   real (ie, we saw a full @protocol definition with list of methods),
+   and not just forward-references (ie, "@protocol NSObject;").  This
+   test checks protocols implemented by other protocols.  */
+
+#include <objc/objc.h>
+
+@protocol MyProtocol;
+
+@interface MyClass <MyProtocol> /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+@end
+
+
+@protocol MyProtocol2 <MyProtocol>
+- (int)method2;
+@end
+
+@interface MyClass2 <MyProtocol2> /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+@end
+
+
+@protocol MyProtocol3 <MyProtocol2>
+- (int)method3;
+@end
+
+@interface MyClass3 <MyProtocol3>  /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+- (int)method3;
+@end
+
+
+@protocol MyProtocol4 <MyProtocol3, MyProtocol2>
+- (int)method4;
+@end
+
+@interface MyClass4 <MyProtocol4>  /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+- (int)method3;
+- (int)method4;
+@end
+
+
+@protocol MyProtocol5
+- (int)method5;
+@end
+
+@interface MyClass5 <MyProtocol5> /* Ok */
+- (int)method5;
+@end
+
+
+@protocol MyProtocol6 <MyProtocol5>
+- (int)method6;
+@end
+
+@interface MyClass6 <MyProtocol6> /* Ok */
+- (int)method5;
+- (int)method6;
+@end
+
+
+@protocol MyProtocol7 <MyProtocol5, MyProtocol4>
+- (int)method7;
+@end
+
+@interface MyClass7 <MyProtocol7> /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+- (int)method3;
+- (int)method4;
+- (int)method5;
+- (int)method7;
+@end
+
+
+/* Now test that if we finally define MyProtocol, the warnings go away.  */
+@protocol MyProtocol
+- (int)method;
+@end
+
+@protocol MyProtocol8 <MyProtocol5, MyProtocol4>
+- (int)method8;
+@end
+
+@interface MyClass8 <MyProtocol8> /* Ok */
+- (int)method;
+- (int)method2;
+- (int)method3;
+- (int)method4;
+- (int)method5;
+- (int)method8;
+@end
index 17d9044ab3aba0667a1890b40de3b90f346e6630..df8dcd70f3e88c661fa25d64a07a08222a9d72af 100644 (file)
@@ -24,7 +24,3 @@
 
 @protocol MyProtocol3 <MyProtocol> /* Ok */
 @end
-
-/* TODO: I guess if MyProtocol3 is now used in an @interface, we
-   should check that all the protocols it references are defined
-   too ?  */
diff --git a/gcc/testsuite/objc.dg/protocol-forward-2.m b/gcc/testsuite/objc.dg/protocol-forward-2.m
new file mode 100644 (file)
index 0000000..9217ca8
--- /dev/null
@@ -0,0 +1,95 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, December 2010.  */
+/* { dg-do compile } */
+
+/* Test that all protocols appearing in @interface declarations are
+   real (ie, we saw a full @protocol definition with list of methods),
+   and not just forward-references (ie, "@protocol NSObject;").  This
+   test checks protocols implemented by other protocols.  */
+
+#include <objc/objc.h>
+
+@protocol MyProtocol;
+
+@interface MyClass <MyProtocol> /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+@end
+
+
+@protocol MyProtocol2 <MyProtocol>
+- (int)method2;
+@end
+
+@interface MyClass2 <MyProtocol2> /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+@end
+
+
+@protocol MyProtocol3 <MyProtocol2>
+- (int)method3;
+@end
+
+@interface MyClass3 <MyProtocol3>  /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+- (int)method3;
+@end
+
+
+@protocol MyProtocol4 <MyProtocol3, MyProtocol2>
+- (int)method4;
+@end
+
+@interface MyClass4 <MyProtocol4>  /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+- (int)method3;
+- (int)method4;
+@end
+
+
+@protocol MyProtocol5
+- (int)method5;
+@end
+
+@interface MyClass5 <MyProtocol5> /* Ok */
+- (int)method5;
+@end
+
+
+@protocol MyProtocol6 <MyProtocol5>
+- (int)method6;
+@end
+
+@interface MyClass6 <MyProtocol6> /* Ok */
+- (int)method5;
+- (int)method6;
+@end
+
+
+@protocol MyProtocol7 <MyProtocol5, MyProtocol4>
+- (int)method7;
+@end
+
+@interface MyClass7 <MyProtocol7> /* { dg-warning "definition of protocol .MyProtocol. not found" } */
+- (int)method2;
+- (int)method3;
+- (int)method4;
+- (int)method5;
+- (int)method7;
+@end
+
+
+/* Now test that if we finally define MyProtocol, the warnings go away.  */
+@protocol MyProtocol
+- (int)method;
+@end
+
+@protocol MyProtocol8 <MyProtocol5, MyProtocol4>
+- (int)method8;
+@end
+
+@interface MyClass8 <MyProtocol8> /* Ok */
+- (int)method;
+- (int)method2;
+- (int)method3;
+- (int)method4;
+- (int)method5;
+- (int)method8;
+@end