blob: 53b5e3d76301eb622094738151c8c99902259d58 [file] [log] [blame]
Ted Kremenek28eace62013-11-23 01:01:34 +00001// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -verify %s -Wno-objc-root-class
2
Ted Kremenekf41cf7f12013-12-10 19:43:48 +00003// Mark this protocol as requiring all of its methods and properties
4// to be explicitly implemented in the adopting class.
5__attribute__((objc_protocol_requires_explicit_implementation))
Ted Kremenek28eace62013-11-23 01:01:34 +00006@protocol Protocol
7- (void) theBestOfTimes; // expected-note {{method 'theBestOfTimes' declared here}}
Ted Kremenekf41cf7f12013-12-10 19:43:48 +00008@property (readonly) id theWorstOfTimes;
Ted Kremenek28eace62013-11-23 01:01:34 +00009@end
10
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000011// In this example, ClassA adopts the protocol. We won't
12// provide the implementation here, but this protocol will
13// be adopted later by a subclass.
Ted Kremenek28eace62013-11-23 01:01:34 +000014@interface ClassA <Protocol>
15- (void) theBestOfTimes;
Ted Kremenek28eace62013-11-23 01:01:34 +000016@property (readonly) id theWorstOfTimes;
17@end
18
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000019// This class subclasses ClassA (which adopts 'Protocol'),
20// but does not provide the needed implementation.
Ted Kremenek2ccf19e2013-12-13 05:58:51 +000021@interface ClassB : ClassA <Protocol>
Ted Kremenek28eace62013-11-23 01:01:34 +000022@end
23
Ted Kremenek2ccf19e2013-12-13 05:58:51 +000024@implementation ClassB // expected-warning {{method 'theBestOfTimes' in protocol 'Protocol' not implemented}}
Ted Kremenek28eace62013-11-23 01:01:34 +000025@end
26
Ted Kremenekc152c522013-12-12 06:20:42 +000027// Test that inherited protocols do not get the explicit conformance requirement.
28@protocol Inherited
29- (void) fairIsFoul;
30@end
31
32__attribute__((objc_protocol_requires_explicit_implementation))
33@protocol Derived <Inherited>
34- (void) foulIsFair; // expected-note {{method 'foulIsFair' declared here}}
35@end
36
37@interface ClassC <Inherited>
38@end
39
Ted Kremenek2ccf19e2013-12-13 05:58:51 +000040@interface ClassD : ClassC <Derived>
Ted Kremenekc152c522013-12-12 06:20:42 +000041@end
42
Ted Kremenek2ccf19e2013-12-13 05:58:51 +000043@implementation ClassD // expected-warning {{method 'foulIsFair' in protocol 'Derived' not implemented}}
Ted Kremenekc152c522013-12-12 06:20:42 +000044@end
45
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000046// Test that the attribute is used correctly.
47__attribute__((objc_protocol_requires_explicit_implementation(1+2))) // expected-error {{attribute takes no arguments}}
48@protocol AnotherProtocol @end
Ted Kremenek28eace62013-11-23 01:01:34 +000049
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000050// Cannot put the attribute on classes or other non-protocol declarations.
51__attribute__((objc_protocol_requires_explicit_implementation)) // expected-error {{attribute only applies to Objective-C protocols}}
52@interface AnotherClass @end
Ted Kremenek28eace62013-11-23 01:01:34 +000053
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000054__attribute__((objc_protocol_requires_explicit_implementation)) // expected-error {{attribute only applies to Objective-C protocols}}
55int x;
Ted Kremenek28eace62013-11-23 01:01:34 +000056
Ted Kremenek33e430f2013-12-13 06:26:14 +000057// Test that inherited protocols with the attribute
58// are treated properly.
59__attribute__((objc_protocol_requires_explicit_implementation))
60@protocol ProtocolA
61@required
Ted Kremenek15478b32014-01-17 08:34:19 +000062- (void)rlyeh; // expected-note 2 {{method 'rlyeh' declared here}}
63- (void)innsmouth; // expected-note 2 {{method 'innsmouth' declared here}}
Ted Kremenek33e430f2013-12-13 06:26:14 +000064@end
65
66@protocol ProtocolB <ProtocolA>
67@required
68- (void)dunwich;
Ted Kremenek15478b32014-01-17 08:34:19 +000069- (void)innsmouth; // expected-note {{method 'innsmouth' declared here}}
70@end
71
72__attribute__((objc_protocol_requires_explicit_implementation))
73@protocol ProtocolB_Explicit <ProtocolA>
74@required
75- (void)dunwich;
76- (void)innsmouth; // expected-note 2 {{method 'innsmouth' declared here}}
Ted Kremenek33e430f2013-12-13 06:26:14 +000077@end
78
79@protocol ProtocolC
80@required
81- (void)rlyeh;
82- (void)innsmouth;
83- (void)dunwich;
84@end
85
Ted Kremenek15478b32014-01-17 08:34:19 +000086@interface MyObject <ProtocolC> @end
Ted Kremenek33e430f2013-12-13 06:26:14 +000087
Ted Kremenek15478b32014-01-17 08:34:19 +000088// Provide two variants of a base class, one that adopts ProtocolA and
89// one that does not.
90@interface Lovecraft <ProtocolA> @end
91@interface Lovecraft_2 @end
Ted Kremenek33e430f2013-12-13 06:26:14 +000092
Ted Kremenek15478b32014-01-17 08:34:19 +000093// Provide two variants of a subclass that conform to ProtocolB. One
94// subclasses from a class that conforms to ProtocolA, the other that
95// does not.
96//
97// From those, provide two variants that conformat to ProtocolB_Explicit
98// instead.
99@interface Shoggoth : Lovecraft <ProtocolB> @end
100@interface Shoggoth_2 : Lovecraft_2 <ProtocolB> @end
101@interface Shoggoth_Explicit : Lovecraft <ProtocolB_Explicit> @end
102@interface Shoggoth_2_Explicit : Lovecraft_2 <ProtocolB_Explicit> @end
103
Ted Kremenek33e430f2013-12-13 06:26:14 +0000104
105@implementation MyObject
106- (void)innsmouth {}
107- (void)rlyeh {}
108- (void)dunwich {}
109@end
110
Ted Kremenek15478b32014-01-17 08:34:19 +0000111@implementation Lovecraft
Ted Kremenek33e430f2013-12-13 06:26:14 +0000112- (void)innsmouth {}
113- (void)rlyeh {}
114@end
115
Ted Kremenek15478b32014-01-17 08:34:19 +0000116@implementation Shoggoth
117- (void)dunwich {}
118@end
119
120@implementation Shoggoth_2 // expected-warning {{method 'innsmouth' in protocol 'ProtocolB' not implemented}}\
121 // expected-warning {{method 'rlyeh' in protocol 'ProtocolA' not implemented}}\
122 // expected-warning {{'innsmouth' in protocol 'ProtocolA' not implemented}}
123- (void)dunwich {}
124@end
125
126@implementation Shoggoth_Explicit // expected-warning {{method 'innsmouth' in protocol 'ProtocolB_Explicit' not implemented}}
127- (void)dunwich {}
128@end
129
130@implementation Shoggoth_2_Explicit // expected-warning {{method 'innsmouth' in protocol 'ProtocolB_Explicit' not implemented}}\
131 // expected-warning {{method 'rlyeh' in protocol 'ProtocolA' not implemented}}\
132 // expected-warning {{method 'innsmouth' in protocol 'ProtocolA' not implemented}}
Ted Kremenek33e430f2013-12-13 06:26:14 +0000133- (void)dunwich {}
134@end
135