| /* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, November 2010. */ |
| /* { dg-do compile } */ |
| |
| #include <objc/objc.h> |
| |
| /* Test that @optional for @protocol works. */ |
| |
| @protocol MyProtocol |
| + (int)classMethod; |
| - (int)method; |
| @optional |
| + (int)optionalClassMethod; |
| - (int)optionalMethod; |
| @end |
| |
| @interface MyRootClass <MyProtocol> |
| @end |
| |
| /* The implementation implements both the @required methods, but none |
| of the @optional ones. There should be no warnings as the |
| @optional methods are optional. ;-) */ |
| @implementation MyRootClass |
| + (int)classMethod |
| { |
| return 20; |
| } |
| - (int)method |
| { |
| return 11; |
| } |
| @end |
| |
| int function (id <MyProtocol> object1, |
| MyRootClass *object2) |
| { |
| /* Test that there are no warnings if you try to use an @optional |
| method with an object of the class. */ |
| int i = 0; |
| |
| i += [object1 method]; |
| i += [object2 method]; |
| i += [MyRootClass classMethod]; |
| i += [object1 optionalMethod]; |
| i += [object2 optionalMethod]; |
| i += [MyRootClass optionalClassMethod]; |
| |
| return i; |
| } |