xref: /llvm-project/clang/test/Sema/ns_error_enum.m (revision 77d21e758ea9665631b211abc0e424d7a7c44989)
1// RUN: %clang_cc1 -verify %s -x objective-c
2// RUN: %clang_cc1 -verify %s -x objective-c++
3
4
5#define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type
6#define NS_ENUM(_type, _name) CF_ENUM(_type, _name)
7
8#define NS_ERROR_ENUM(_type, _name, _domain)  \
9  enum _name : _type _name; enum __attribute__((ns_error_domain(_domain))) _name : _type
10
11typedef NS_ENUM(unsigned, MyEnum) {
12  MyFirst,
13  MySecond,
14};
15
16typedef NS_ENUM(invalidType, MyInvalidEnum) {
17// expected-error@-1{{unknown type name 'invalidType'}}
18// expected-error@-2{{unknown type name 'invalidType'}}
19  MyFirstInvalid,
20  MySecondInvalid,
21};
22
23@interface NSString
24@end
25
26extern NSString *const MyErrorDomain;
27typedef NS_ERROR_ENUM(unsigned char, MyErrorEnum, MyErrorDomain) {
28	MyErrFirst,
29	MyErrSecond,
30};
31
32typedef NSString *const NsErrorDomain;
33extern NsErrorDomain MyTypedefErrorDomain;
34typedef NS_ERROR_ENUM(unsigned char, MyTypedefErrorEnum, MyTypedefErrorDomain) {
35  MyTypedefErrFirst,
36  MyTypedefErrSecond,
37};
38
39typedef const struct __CFString * CFStringRef;
40
41extern CFStringRef const MyCFErrorDomain;
42typedef NS_ERROR_ENUM(unsigned char, MyCFErrorEnum, MyCFErrorDomain) {
43  MyCFErrFirst,
44  MyCFErrSecond,
45};
46
47typedef CFStringRef CFErrorDomain;
48extern CFErrorDomain const MyCFTypedefErrorDomain;
49typedef NS_ERROR_ENUM(unsigned char, MyCFTypedefErrorEnum, MyCFTypedefErrorDomain) {
50  MyCFTypedefErrFirst,
51  MyCFTypedefErrSecond,
52};
53
54extern char *const WrongErrorDomainType;
55enum __attribute__((ns_error_domain(WrongErrorDomainType))) MyWrongErrorDomainType { MyWrongErrorDomain };
56
57struct __attribute__((ns_error_domain(MyErrorDomain))) MyStructWithErrorDomain {};
58// expected-error@-1{{'ns_error_domain' attribute only applies to enums}}
59
60int __attribute__((ns_error_domain(MyErrorDomain))) NotTagDecl;
61  // expected-error@-1{{'ns_error_domain' attribute only applies to enums}}
62
63enum __attribute__((ns_error_domain())) NoArg { NoArgError };
64// expected-error@-1{{'ns_error_domain' attribute takes one argument}}
65
66enum __attribute__((ns_error_domain(MyErrorDomain, MyErrorDomain))) TwoArgs { TwoArgsError };
67// expected-error@-1{{'ns_error_domain' attribute takes one argument}}
68
69typedef NS_ERROR_ENUM(unsigned char, MyErrorEnumInvalid, InvalidDomain) {
70	// expected-error@-1{{domain argument 'InvalidDomain' does not refer to global constant}}
71	MyErrFirstInvalid,
72	MyErrSecondInvalid,
73};
74
75typedef NS_ERROR_ENUM(unsigned char, MyErrorEnumInvalid, "domain-string");
76  // expected-error@-1{{domain argument does not refer to global constant}}
77
78void foo(void) {}
79typedef NS_ERROR_ENUM(unsigned char, MyErrorEnumInvalidFunction, foo);
80  // expected-error@-1{{domain argument 'foo' does not refer to global constant}}
81