From ca2ed3ba8e3069e6c9b269d02b70d14b8d227da5 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Sun, 2 Jan 2011 10:19:42 +0000 Subject: [PATCH] In gcc/objc/: 2011-01-02 Nicola Pero In gcc/objc/: 2011-01-02 Nicola Pero * 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 * 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 | 5 + gcc/objc/objc-act.c | 26 ++++- gcc/testsuite/ChangeLog | 7 ++ .../obj-c++.dg/protocol-forward-1.mm | 3 - .../obj-c++.dg/protocol-forward-2.mm | 95 +++++++++++++++++++ gcc/testsuite/objc.dg/protocol-forward-1.m | 4 - gcc/testsuite/objc.dg/protocol-forward-2.m | 95 +++++++++++++++++++ 7 files changed, 224 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/obj-c++.dg/protocol-forward-2.mm create mode 100644 gcc/testsuite/objc.dg/protocol-forward-2.m diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 12536a03724..7a9387f5fb1 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,8 @@ +2011-01-02 Nicola Pero + + * objc-act.c (check_that_protocol_is_defined): New. + (lookup_protocol): Call check_that_protocol_is_defined. + 2010-12-30 Nicola Pero * 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 a37f3d91457..b65b928060d 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8c037b2231e..43d9687d97c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-01-02 Nicola Pero + + * 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 PR target/38662 diff --git a/gcc/testsuite/obj-c++.dg/protocol-forward-1.mm b/gcc/testsuite/obj-c++.dg/protocol-forward-1.mm index 17d9044ab3a..03c7ae065da 100644 --- a/gcc/testsuite/obj-c++.dg/protocol-forward-1.mm +++ b/gcc/testsuite/obj-c++.dg/protocol-forward-1.mm @@ -25,6 +25,3 @@ @protocol MyProtocol3 /* 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 index 00000000000..9217ca8d55a --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/protocol-forward-2.mm @@ -0,0 +1,95 @@ +/* Contributed by Nicola Pero , 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 + +@protocol MyProtocol; + +@interface MyClass /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +@end + + +@protocol MyProtocol2 +- (int)method2; +@end + +@interface MyClass2 /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +- (int)method2; +@end + + +@protocol MyProtocol3 +- (int)method3; +@end + +@interface MyClass3 /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +- (int)method2; +- (int)method3; +@end + + +@protocol MyProtocol4 +- (int)method4; +@end + +@interface MyClass4 /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +- (int)method2; +- (int)method3; +- (int)method4; +@end + + +@protocol MyProtocol5 +- (int)method5; +@end + +@interface MyClass5 /* Ok */ +- (int)method5; +@end + + +@protocol MyProtocol6 +- (int)method6; +@end + +@interface MyClass6 /* Ok */ +- (int)method5; +- (int)method6; +@end + + +@protocol MyProtocol7 +- (int)method7; +@end + +@interface MyClass7 /* { 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 +- (int)method8; +@end + +@interface MyClass8 /* Ok */ +- (int)method; +- (int)method2; +- (int)method3; +- (int)method4; +- (int)method5; +- (int)method8; +@end diff --git a/gcc/testsuite/objc.dg/protocol-forward-1.m b/gcc/testsuite/objc.dg/protocol-forward-1.m index 17d9044ab3a..df8dcd70f3e 100644 --- a/gcc/testsuite/objc.dg/protocol-forward-1.m +++ b/gcc/testsuite/objc.dg/protocol-forward-1.m @@ -24,7 +24,3 @@ @protocol MyProtocol3 /* 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 index 00000000000..9217ca8d55a --- /dev/null +++ b/gcc/testsuite/objc.dg/protocol-forward-2.m @@ -0,0 +1,95 @@ +/* Contributed by Nicola Pero , 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 + +@protocol MyProtocol; + +@interface MyClass /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +@end + + +@protocol MyProtocol2 +- (int)method2; +@end + +@interface MyClass2 /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +- (int)method2; +@end + + +@protocol MyProtocol3 +- (int)method3; +@end + +@interface MyClass3 /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +- (int)method2; +- (int)method3; +@end + + +@protocol MyProtocol4 +- (int)method4; +@end + +@interface MyClass4 /* { dg-warning "definition of protocol .MyProtocol. not found" } */ +- (int)method2; +- (int)method3; +- (int)method4; +@end + + +@protocol MyProtocol5 +- (int)method5; +@end + +@interface MyClass5 /* Ok */ +- (int)method5; +@end + + +@protocol MyProtocol6 +- (int)method6; +@end + +@interface MyClass6 /* Ok */ +- (int)method5; +- (int)method6; +@end + + +@protocol MyProtocol7 +- (int)method7; +@end + +@interface MyClass7 /* { 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 +- (int)method8; +@end + +@interface MyClass8 /* Ok */ +- (int)method; +- (int)method2; +- (int)method3; +- (int)method4; +- (int)method5; +- (int)method8; +@end -- 2.30.2