aboutsummaryrefslogtreecommitdiff
path: root/gcc/objc
diff options
context:
space:
mode:
authorNicola Pero <nicola.pero@meta-innovation.com>2011-01-02 10:19:42 +0000
committerNicola Pero <nicola@gcc.gnu.org>2011-01-02 10:19:42 +0000
commitca2ed3ba8e3069e6c9b269d02b70d14b8d227da5 (patch)
tree11c76db2f4f7ce2099f86c2f785be90df61a15e5 /gcc/objc
parent5af62fcd9311650891737643858e34433ab4557a (diff)
downloadgcc-ca2ed3ba8e3069e6c9b269d02b70d14b8d227da5.zip
gcc-ca2ed3ba8e3069e6c9b269d02b70d14b8d227da5.tar.gz
gcc-ca2ed3ba8e3069e6c9b269d02b70d14b8d227da5.tar.bz2
In gcc/objc/: 2011-01-02 Nicola Pero <nicola.pero@meta-innovation.com>
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
Diffstat (limited to 'gcc/objc')
-rw-r--r--gcc/objc/ChangeLog5
-rw-r--r--gcc/objc/objc-act.c26
2 files changed, 27 insertions, 4 deletions
diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog
index 12536a0..7a9387f 100644
--- a/gcc/objc/ChangeLog
+++ b/gcc/objc/ChangeLog
@@ -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
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c
index a37f3d9..b65b928 100644
--- a/gcc/objc/objc-act.c
+++ b/gcc/objc/objc-act.c
@@ -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;
}