blob: 3d6537015c8eed791bbf5e15fc8ec5d431175e9c [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.
21@interface ClassB : ClassA <Protocol> // expected-note {{required for direct or indirect protocol 'Protocol'}}
Ted Kremenek28eace62013-11-23 01:01:34 +000022@end
23
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000024@implementation ClassB // expected-warning {{method 'theBestOfTimes' in protocol not implemented}}
Ted Kremenek28eace62013-11-23 01:01:34 +000025@end
26
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000027// Test that the attribute is used correctly.
28__attribute__((objc_protocol_requires_explicit_implementation(1+2))) // expected-error {{attribute takes no arguments}}
29@protocol AnotherProtocol @end
Ted Kremenek28eace62013-11-23 01:01:34 +000030
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000031// Cannot put the attribute on classes or other non-protocol declarations.
32__attribute__((objc_protocol_requires_explicit_implementation)) // expected-error {{attribute only applies to Objective-C protocols}}
33@interface AnotherClass @end
Ted Kremenek28eace62013-11-23 01:01:34 +000034
Ted Kremenekf41cf7f12013-12-10 19:43:48 +000035__attribute__((objc_protocol_requires_explicit_implementation)) // expected-error {{attribute only applies to Objective-C protocols}}
36int x;
Ted Kremenek28eace62013-11-23 01:01:34 +000037