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
This commit is contained in:
parent
5af62fcd93
commit
ca2ed3ba8e
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 ? */
|
||||
|
95
gcc/testsuite/obj-c++.dg/protocol-forward-2.mm
Normal file
95
gcc/testsuite/obj-c++.dg/protocol-forward-2.mm
Normal file
@ -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
|
@ -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 ? */
|
||||
|
95
gcc/testsuite/objc.dg/protocol-forward-2.m
Normal file
95
gcc/testsuite/objc.dg/protocol-forward-2.m
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user