xref: /llvm-project/clang/test/APINotes/versioned.m (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1// RUN: rm -rf %t && mkdir -p %t
2
3// Build and check the unversioned module file.
4// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Unversioned -fdisable-module-hash -fapinotes-modules -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
5// RUN: %clang_cc1 -ast-print %t/ModulesCache/Unversioned/VersionedKit.pcm | FileCheck -check-prefix=CHECK-UNVERSIONED %s
6// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Unversioned -fdisable-module-hash -fapinotes-modules -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'DUMP' | FileCheck -check-prefix=CHECK-DUMP -check-prefix=CHECK-UNVERSIONED-DUMP %s
7
8// Build and check the versioned module file.
9// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Versioned -fdisable-module-hash -fapinotes-modules -fapinotes-swift-version=3 -fsyntax-only -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s
10// RUN: %clang_cc1 -ast-print %t/ModulesCache/Versioned/VersionedKit.pcm | FileCheck -check-prefix=CHECK-VERSIONED %s
11// RUN: %clang_cc1 -fmodules -fblocks -fimplicit-module-maps -fmodules-cache-path=%t/ModulesCache/Versioned -fdisable-module-hash -fapinotes-modules -fapinotes-swift-version=3 -I %S/Inputs/Headers -F %S/Inputs/Frameworks %s -ast-dump -ast-dump-filter 'DUMP' | FileCheck -check-prefix=CHECK-DUMP -check-prefix=CHECK-VERSIONED-DUMP %s
12
13#import <VersionedKit/VersionedKit.h>
14
15// CHECK-UNVERSIONED: void moveToPointDUMP(double x, double y) __attribute__((swift_name("moveTo(x:y:)")));
16// CHECK-VERSIONED:__attribute__((swift_name("moveTo(a:b:)"))) void moveToPointDUMP(double x, double y);
17
18// CHECK-DUMP-LABEL: Dumping moveToPointDUMP
19// CHECK-VERSIONED-DUMP: SwiftVersionedAdditionAttr {{.+}} Implicit 3.0 IsReplacedByActive{{$}}
20// CHECK-VERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} "moveTo(x:y:)"
21// CHECK-VERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <<invalid sloc>> "moveTo(a:b:)"
22// CHECK-UNVERSIONED-DUMP: SwiftNameAttr {{.+}} "moveTo(x:y:)"
23// CHECK-UNVERSIONED-DUMP-NEXT: SwiftVersionedAdditionAttr {{.+}} Implicit 3.0{{$}}
24// CHECK-UNVERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <<invalid sloc>> "moveTo(a:b:)"
25// CHECK-DUMP-NOT: Attr
26
27// CHECK-DUMP-LABEL: Dumping unversionedRenameDUMP
28// CHECK-DUMP: in VersionedKit unversionedRenameDUMP
29// CHECK-DUMP-NEXT: SwiftVersionedAdditionAttr {{.+}} Implicit 0 IsReplacedByActive{{$}}
30// CHECK-DUMP-NEXT: SwiftNameAttr {{.+}} "unversionedRename_HEADER()"
31// CHECK-DUMP-NEXT: SwiftNameAttr {{.+}} "unversionedRename_NOTES()"
32// CHECK-DUMP-NOT: Attr
33
34// CHECK-DUMP-LABEL: Dumping TestGenericDUMP
35// CHECK-VERSIONED-DUMP: SwiftImportAsNonGenericAttr {{.+}} <<invalid sloc>>
36// CHECK-UNVERSIONED-DUMP: SwiftVersionedAdditionAttr {{.+}} Implicit 3.0{{$}}
37// CHECK-UNVERSIONED-DUMP-NEXT: SwiftImportAsNonGenericAttr {{.+}} <<invalid sloc>>
38// CHECK-DUMP-NOT: Attr
39
40// CHECK-DUMP-LABEL: Dumping Swift3RenamedOnlyDUMP
41// CHECK-DUMP: in VersionedKit Swift3RenamedOnlyDUMP
42// CHECK-VERSIONED-DUMP-NEXT: SwiftVersionedRemovalAttr {{.+}} Implicit 3.0 {{[0-9]+}} IsReplacedByActive{{$}}
43// CHECK-VERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} "SpecialSwift3Name"
44// CHECK-UNVERSIONED-DUMP-NEXT: SwiftVersionedAdditionAttr {{.+}} Implicit 3.0{{$}}
45// CHECK-UNVERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <<invalid sloc>> "SpecialSwift3Name"
46// CHECK-DUMP-NOT: Attr
47
48// CHECK-DUMP-LABEL: Dumping Swift3RenamedAlsoDUMP
49// CHECK-DUMP: in VersionedKit Swift3RenamedAlsoDUMP
50// CHECK-VERSIONED-DUMP-NEXT: SwiftVersionedAdditionAttr {{.+}} Implicit 3.0 IsReplacedByActive{{$}}
51// CHECK-VERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <line:{{.+}}, col:{{.+}}> "Swift4Name"
52// CHECK-VERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} "SpecialSwift3Also"
53// CHECK-UNVERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <line:{{.+}}, col:{{.+}}> "Swift4Name"
54// CHECK-UNVERSIONED-DUMP-NEXT: SwiftVersionedAdditionAttr {{.+}} Implicit 3.0{{$}}
55// CHECK-UNVERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <<invalid sloc>> "SpecialSwift3Also"
56// CHECK-DUMP-NOT: Attr
57
58// CHECK-DUMP-LABEL: Dumping Swift4RenamedDUMP
59// CHECK-DUMP: in VersionedKit Swift4RenamedDUMP
60// CHECK-VERSIONED-DUMP-NEXT: SwiftVersionedRemovalAttr {{.+}} Implicit 4 {{[0-9]+}} IsReplacedByActive{{$}}
61// CHECK-VERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} "SpecialSwift4Name"
62// CHECK-UNVERSIONED-DUMP-NEXT: SwiftVersionedAdditionAttr {{.+}} Implicit 4{{$}}
63// CHECK-UNVERSIONED-DUMP-NEXT: SwiftNameAttr {{.+}} <<invalid sloc>> "SpecialSwift4Name"
64// CHECK-DUMP-NOT: Attr
65
66// CHECK-DUMP-NOT: Dumping
67
68// CHECK-UNVERSIONED: void acceptClosure(__attribute__((noescape)) void (^block)(void));
69// CHECK-VERSIONED: void acceptClosure(void (^block)(void));
70
71// CHECK-UNVERSIONED: void privateFunc(void) __attribute__((swift_private));
72
73// CHECK-UNVERSIONED: typedef double MyDoubleWrapper __attribute__((swift_wrapper("struct")));
74
75// CHECK-UNVERSIONED:      enum __attribute__((ns_error_domain(MyErrorDomain))) MyErrorCode {
76// CHECK-UNVERSIONED-NEXT:     MyErrorCodeFailed = 1
77// CHECK-UNVERSIONED-NEXT: };
78
79// CHECK-UNVERSIONED: __attribute__((swift_bridge("MyValueType")))
80// CHECK-UNVERSIONED: @interface MyReferenceType
81
82// CHECK-VERSIONED: void privateFunc(void);
83
84// CHECK-VERSIONED: typedef double MyDoubleWrapper;
85
86// CHECK-VERSIONED:      enum MyErrorCode {
87// CHECK-VERSIONED-NEXT:     MyErrorCodeFailed = 1
88// CHECK-VERSIONED-NEXT: };
89
90// CHECK-VERSIONED-NOT: __attribute__((swift_bridge("MyValueType")))
91// CHECK-VERSIONED: @interface MyReferenceType
92
93// CHECK-UNVERSIONED: __attribute__((swift_objc_members)
94// CHECK-UNVERSIONED-NEXT: @interface TestProperties
95// CHECK-VERSIONED-NOT: __attribute__((swift_objc_members)
96// CHECK-VERSIONED: @interface TestProperties
97
98// CHECK-UNVERSIONED-LABEL: enum __attribute__((flag_enum)) FlagEnum {
99// CHECK-UNVERSIONED-NEXT:     FlagEnumA = 1,
100// CHECK-UNVERSIONED-NEXT:     FlagEnumB = 2
101// CHECK-UNVERSIONED-NEXT: };
102// CHECK-UNVERSIONED-LABEL: enum __attribute__((flag_enum)) NewlyFlagEnum {
103// CHECK-UNVERSIONED-NEXT:     NewlyFlagEnumA = 1,
104// CHECK-UNVERSIONED-NEXT:     NewlyFlagEnumB = 2
105// CHECK-UNVERSIONED-NEXT: };
106// CHECK-UNVERSIONED-LABEL: enum __attribute__((flag_enum)) APINotedFlagEnum {
107// CHECK-UNVERSIONED-NEXT:     APINotedFlagEnumA = 1,
108// CHECK-UNVERSIONED-NEXT:     APINotedFlagEnumB = 2
109// CHECK-UNVERSIONED-NEXT: };
110// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) OpenEnum {
111// CHECK-UNVERSIONED-NEXT:     OpenEnumA = 1
112// CHECK-UNVERSIONED-NEXT: };
113// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) NewlyOpenEnum {
114// CHECK-UNVERSIONED-NEXT:     NewlyOpenEnumA = 1
115// CHECK-UNVERSIONED-NEXT: };
116// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("closed"))) NewlyClosedEnum {
117// CHECK-UNVERSIONED-NEXT:     NewlyClosedEnumA = 1
118// CHECK-UNVERSIONED-NEXT: };
119// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) ClosedToOpenEnum {
120// CHECK-UNVERSIONED-NEXT:     ClosedToOpenEnumA = 1
121// CHECK-UNVERSIONED-NEXT: };
122// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("closed"))) OpenToClosedEnum {
123// CHECK-UNVERSIONED-NEXT:     OpenToClosedEnumA = 1
124// CHECK-UNVERSIONED-NEXT: };
125// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) APINotedOpenEnum {
126// CHECK-UNVERSIONED-NEXT:     APINotedOpenEnumA = 1
127// CHECK-UNVERSIONED-NEXT: };
128// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("closed"))) APINotedClosedEnum {
129// CHECK-UNVERSIONED-NEXT:     APINotedClosedEnumA = 1
130// CHECK-UNVERSIONED-NEXT: };
131
132// CHECK-VERSIONED-LABEL: enum __attribute__((flag_enum)) FlagEnum {
133// CHECK-VERSIONED-NEXT:     FlagEnumA = 1,
134// CHECK-VERSIONED-NEXT:     FlagEnumB = 2
135// CHECK-VERSIONED-NEXT: };
136// CHECK-VERSIONED-LABEL: enum NewlyFlagEnum {
137// CHECK-VERSIONED-NEXT:     NewlyFlagEnumA = 1,
138// CHECK-VERSIONED-NEXT:     NewlyFlagEnumB = 2
139// CHECK-VERSIONED-NEXT: };
140// CHECK-VERSIONED-LABEL: enum __attribute__((flag_enum)) APINotedFlagEnum {
141// CHECK-VERSIONED-NEXT:     APINotedFlagEnumA = 1,
142// CHECK-VERSIONED-NEXT:     APINotedFlagEnumB = 2
143// CHECK-VERSIONED-NEXT: };
144// CHECK-VERSIONED-LABEL: enum __attribute__((enum_extensibility("open"))) OpenEnum {
145// CHECK-VERSIONED-NEXT:     OpenEnumA = 1
146// CHECK-VERSIONED-NEXT: };
147// CHECK-VERSIONED-LABEL: enum NewlyOpenEnum {
148// CHECK-VERSIONED-NEXT:     NewlyOpenEnumA = 1
149// CHECK-VERSIONED-NEXT: };
150// CHECK-VERSIONED-LABEL: enum NewlyClosedEnum {
151// CHECK-VERSIONED-NEXT:     NewlyClosedEnumA = 1
152// CHECK-VERSIONED-NEXT: };
153// CHECK-VERSIONED-LABEL: enum __attribute__((enum_extensibility("closed"))) ClosedToOpenEnum {
154// CHECK-VERSIONED-NEXT:     ClosedToOpenEnumA = 1
155// CHECK-VERSIONED-NEXT: };
156// CHECK-VERSIONED-LABEL: enum __attribute__((enum_extensibility("open"))) OpenToClosedEnum {
157// CHECK-VERSIONED-NEXT:     OpenToClosedEnumA = 1
158// CHECK-VERSIONED-NEXT: };
159// CHECK-VERSIONED-LABEL: enum __attribute__((enum_extensibility("open"))) APINotedOpenEnum {
160// CHECK-VERSIONED-NEXT:     APINotedOpenEnumA = 1
161// CHECK-VERSIONED-NEXT: };
162// CHECK-VERSIONED-LABEL: enum __attribute__((enum_extensibility("closed"))) APINotedClosedEnum {
163// CHECK-VERSIONED-NEXT:     APINotedClosedEnumA = 1
164// CHECK-VERSIONED-NEXT: };
165
166// These don't actually have versioned information, so we just check them once.
167// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) SoonToBeCFEnum {
168// CHECK-UNVERSIONED-NEXT:     SoonToBeCFEnumA = 1
169// CHECK-UNVERSIONED-NEXT: };
170// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) SoonToBeNSEnum {
171// CHECK-UNVERSIONED-NEXT:     SoonToBeNSEnumA = 1
172// CHECK-UNVERSIONED-NEXT: };
173// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) __attribute__((flag_enum)) SoonToBeCFOptions {
174// CHECK-UNVERSIONED-NEXT:     SoonToBeCFOptionsA = 1
175// CHECK-UNVERSIONED-NEXT: };
176// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("open"))) __attribute__((flag_enum)) SoonToBeNSOptions {
177// CHECK-UNVERSIONED-NEXT:     SoonToBeNSOptionsA = 1
178// CHECK-UNVERSIONED-NEXT: };
179// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("closed"))) SoonToBeCFClosedEnum {
180// CHECK-UNVERSIONED-NEXT:     SoonToBeCFClosedEnumA = 1
181// CHECK-UNVERSIONED-NEXT: };
182// CHECK-UNVERSIONED-LABEL: enum  __attribute__((enum_extensibility("closed"))) SoonToBeNSClosedEnum {
183// CHECK-UNVERSIONED-NEXT:     SoonToBeNSClosedEnumA = 1
184// CHECK-UNVERSIONED-NEXT: };
185// CHECK-UNVERSIONED-LABEL: enum UndoAllThatHasBeenDoneToMe {
186// CHECK-UNVERSIONED-NEXT:     UndoAllThatHasBeenDoneToMeA = 1
187// CHECK-UNVERSIONED-NEXT: };
188