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:
Nicola Pero 2011-01-02 10:19:42 +00:00 committed by Nicola Pero
parent 5af62fcd93
commit ca2ed3ba8e
7 changed files with 224 additions and 11 deletions

View 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

View 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;
}

View 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

View 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 ? */

View 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

View 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 ? */

View 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