1// Test without serialization:
2// RUN: %clang_cc1 -fdouble-square-bracket-attributes -triple x86_64-apple-macosx10.10.0 \
3// RUN: -ast-dump -ast-dump-filter Test %s \
4// RUN: | FileCheck --strict-whitespace %s
5//
6// Test with serialization:
7// RUN: %clang_cc1 -fdouble-square-bracket-attributes -triple x86_64-apple-macosx10.10.0 \
8// RUN: -emit-pch -o %t %s
9// RUN: %clang_cc1 -x objective-c -fdouble-square-bracket-attributes -triple x86_64-apple-macosx10.10.0 \
10// RUN: -include-pch %t -ast-dump-all -ast-dump-filter Test /dev/null \
11// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
12// RUN: | FileCheck --strict-whitespace %s
13
14@interface NSObject
15@end
16
17[[clang::objc_exception]]
18@interface Test1 {
19// CHECK: ObjCInterfaceDecl{{.*}} Test1
20// CHECK-NEXT: ObjCExceptionAttr{{.*}}
21  [[clang::iboutlet]] NSObject *Test2;
22// CHECK: ObjCIvarDecl{{.*}} Test2
23// CHECK-NEXT: IBOutletAttr
24}
25@property (readonly) [[clang::objc_returns_inner_pointer]] void *Test3, *Test4;
26// CHECK: ObjCPropertyDecl{{.*}} Test3 'void *' readonly
27// CHECK-NEXT: ObjCReturnsInnerPointerAttr
28// CHECK-NEXT: ObjCPropertyDecl{{.*}} Test4 'void *' readonly
29// CHECK-NEXT: ObjCReturnsInnerPointerAttr
30
31@property (readonly) [[clang::iboutlet]] NSObject *Test5;
32// CHECK: ObjCPropertyDecl{{.*}} Test5 'NSObject *' readonly
33// CHECK-NEXT: IBOutletAttr
34
35// CHECK: ObjCMethodDecl{{.*}} implicit{{.*}} Test3
36// CHECK-NEXT: ObjCReturnsInnerPointerAttr
37// CHECK: ObjCMethodDecl{{.*}} implicit{{.*}} Test4
38// CHECK-NEXT: ObjCReturnsInnerPointerAttr
39// CHECK: ObjCMethodDecl{{.*}} implicit{{.*}} Test5
40// CHECK-NOT: IBOutletAttr
41@end
42
43[[clang::objc_runtime_name("name")]] @protocol Test6;
44// CHECK: ObjCProtocolDecl{{.*}} Test6
45// CHECK-NEXT: ObjCRuntimeNameAttr{{.*}} "name"
46
47[[clang::objc_protocol_requires_explicit_implementation]]
48@protocol Test7
49// CHECK: ObjCProtocolDecl{{.*}} Test7
50// CHECK-NEXT: ObjCExplicitProtocolImplAttr
51@end
52
53@interface Test8
54// CHECK: ObjCInterfaceDecl{{.*}} Test8
55-(void)Test9 [[clang::ns_consumes_self]];
56// CHECK: ObjCMethodDecl{{.*}} Test9 'void'
57// CHECK-NEXT: NSConsumesSelfAttr
58-(void) [[clang::ns_consumes_self]] Test10: (int)Test11;
59// CHECK: ObjCMethodDecl{{.*}} Test10: 'void'
60// CHECK-NEXT: |-ParmVarDecl{{.*}} Test11 'int'
61// CHECK-NEXT: `-NSConsumesSelfAttr
62-(void)Test12: (int *) [[clang::noescape]] Test13  to:(int)Test14 [[clang::ns_consumes_self]];
63// CHECK: ObjCMethodDecl{{.*}} Test12:to: 'void'
64// CHECK-NEXT: |-ParmVarDecl{{.*}} Test13 'int *'
65// CHECK-NEXT: | `-NoEscapeAttr
66// CHECK-NEXT: |-ParmVarDecl{{.*}} Test14 'int'
67// CHECK-NEXT: `-NSConsumesSelfAttr
68@end
69