Skip to content

Commit d1e9c47

Browse files
committed
Hide objcImpl resilience support behind feature
Resilence support will require changes to the Objective-C runtime to expand support for metadata initialization functions. Add a separate experimental feature flag to help with staging that support in, and modify diagnostics to not suggest increasing the minimum deployment target for now.
1 parent 4525d88 commit d1e9c47

11 files changed

+190
-75
lines changed

include/swift/AST/DiagnosticsIRGen.def

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,12 @@ NOTE(layout_strings_blocked,none,
6969
"Layout string value witnesses have been disabled for module '%0' "
7070
"through block list entry", (StringRef))
7171

72-
ERROR(attr_objc_implementation_resilient_property_unsupported, none,
72+
ERROR(attr_objc_implementation_resilient_property_not_supported, none,
73+
"'@implementation' does not support stored properties whose size can "
74+
"change due to library evolution; store this value in an object or 'any' "
75+
"type",
76+
())
77+
ERROR(attr_objc_implementation_resilient_property_deployment_target, none,
7378
"'@implementation' on %0 %1 does not support stored properties whose "
7479
"size can change due to library evolution; raise the minimum deployment "
7580
"target to %0 %2 or store this value in an object or 'any' type",

include/swift/Basic/Features.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,11 @@ EXPERIMENTAL_FEATURE(GlobalActorIsolatedTypesUsability, true)
379379
// Enable @implementation on extensions of ObjC classes.
380380
EXPERIMENTAL_FEATURE(ObjCImplementation, true)
381381

382+
// Enable @implementation on extensions of ObjC classes with non-fixed layout
383+
// due to resilient stored properties. Requires OS support; this flag exists for
384+
// staging purposes.
385+
EXPERIMENTAL_FEATURE(ObjCImplementationWithResilientStorage, true)
386+
382387
// Enable @implementation on @_cdecl functions.
383388
EXPERIMENTAL_FEATURE(CImplementation, true)
384389

lib/AST/FeatureSet.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,7 @@ static bool usesFeatureGlobalActorIsolatedTypesUsability(Decl *decl) {
694694
}
695695

696696
UNINTERESTING_FEATURE(ObjCImplementation)
697+
UNINTERESTING_FEATURE(ObjCImplementationWithResilientStorage)
697698
UNINTERESTING_FEATURE(CImplementation)
698699

699700
static bool usesFeatureSensitive(Decl *decl) {

lib/IRGen/GenMeta.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5096,12 +5096,19 @@ diagnoseUnsupportedObjCImplLayout(IRGenModule &IGM, ClassDecl *classDecl,
50965096
elemLayout.getType().isFixedSize())
50975097
return;
50985098

5099-
diags.diagnose(
5100-
field.getVarDecl(),
5101-
diag::attr_objc_implementation_resilient_property_unsupported,
5102-
prettyPlatformString(targetPlatform(ctx.LangOpts)),
5103-
currentAvailability.getOSVersion().getLowerEndpoint(),
5104-
requiredAvailability.getOSVersion().getLowerEndpoint());
5099+
if (ctx.LangOpts.hasFeature(
5100+
Feature::ObjCImplementationWithResilientStorage))
5101+
diags.diagnose(
5102+
field.getVarDecl(),
5103+
diag::attr_objc_implementation_resilient_property_deployment_target,
5104+
prettyPlatformString(targetPlatform(ctx.LangOpts)),
5105+
currentAvailability.getOSVersion().getLowerEndpoint(),
5106+
requiredAvailability.getOSVersion().getLowerEndpoint());
5107+
else
5108+
diags.diagnose(
5109+
field.getVarDecl(),
5110+
diag::attr_objc_implementation_resilient_property_not_supported);
5111+
51055112
diagnosed = true;
51065113
});
51075114

test/IRGen/objc_implementation_deployment_target_resilience.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -target %target-stable-abi-triple -I %S/Inputs/abi -F %clang-importer-sdk-path/frameworks %s -import-objc-header %S/Inputs/objc_implementation.h -emit-ir -o %t.ir -enable-library-evolution -verify
2+
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -target %target-stable-abi-triple -I %S/Inputs/abi -F %clang-importer-sdk-path/frameworks %s -import-objc-header %S/Inputs/objc_implementation.h -emit-ir -o %t.ir -enable-library-evolution -enable-experimental-feature ObjCImplementationWithResilientStorage -target %target-future-triple
23
// REQUIRES: objc_interop
34

45
@_objcImplementation extension ImplClassWithResilientStoredProperty {
56
@objc var beforeInt: Int32 = 0 // no-error
6-
final var a: Mirror? // expected-error {{does not support stored properties whose size can change due to library evolution; raise the minimum deployment target to}}
7+
final var a: Mirror? // expected-error {{does not support stored properties whose size can change due to library evolution; store this value in an object or 'any' type}}
78
final var b: AnyKeyPath? // no-error
89
final var c: Int = 0 // no-error
910
final var d: S1? // no-error
10-
final var e: S2? // expected-error {{does not support stored properties whose size can change due to library evolution; raise the minimum deployment target to}}
11+
final var e: S2? // expected-error {{does not support stored properties whose size can change due to library evolution; store this value in an object or 'any' type}}
1112
final var f: C1? // no-error
1213
@objc var afterInt: Int32 = 0 // no-error
1314
}

test/Interpreter/objc_implementation.swift

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ class LastWords {
5050
}
5151

5252
@objc func testSelf() {
53+
#if RESILIENCE
5354
let resilientImpl = Self.makeResilientImpl()
5455
resilientImpl.printSelf(withLabel: 1)
5556
resilientImpl.mutate()
5657
resilientImpl.printSelf(withLabel: 2)
58+
#endif
5759

5860
self.printSelf(withLabel: 1)
5961
self.implProperty = 42
@@ -72,7 +74,11 @@ class LastWords {
7274
@objc func someMethod() -> String { "ImplClass" }
7375

7476
@objc class func makeResilientImpl() -> ImplClassWithResilientStoredProperty {
77+
#if RESILIENCE
7578
ImplClassWithResilientStoredProperty()
79+
#else
80+
fatalError()
81+
#endif
7682
}
7783

7884
open override var description: String {
@@ -102,11 +108,14 @@ class SwiftSubclass: ImplClass {
102108
print("\(type).otherProperty =", self.otherProperty)
103109
}
104110

111+
#if RESILIENCE
105112
override class func makeResilientImpl() -> ImplClassWithResilientStoredProperty {
106113
SwiftResilientStoredSubclass()
107114
}
115+
#endif
108116
}
109117

118+
#if RESILIENCE
110119
@_objcImplementation extension ImplClassWithResilientStoredProperty {
111120
final var mirror: Mirror?
112121
final var afterMirrorProperty: Int
@@ -151,6 +160,7 @@ extension SwiftSubclass {
151160
}
152161
}
153162
}
163+
#endif
154164

155165
@_objcImplementation @_cdecl("implFunc") public func implFunc(_ param: Int32) {
156166
print("implFunc(\(param))")
@@ -162,12 +172,12 @@ ImplClass.runTests()
162172
// CHECK: implFunc(1989)
163173
// CHECK-LABEL: *** ImplClass init ***
164174
// CHECK: ImplClass.init()
165-
// CHECK-LABEL: *** ImplClassWithResilientStoredProperty #1 ***
166-
// CHECK: ImplClassWithResilientStoredProperty.mirror = nil
167-
// CHECK: ImplClassWithResilientStoredProperty.afterMirrorProperty = 0
168-
// CHECK-LABEL: *** ImplClassWithResilientStoredProperty #2 ***
169-
// CHECK: ImplClassWithResilientStoredProperty.mirror = nil
170-
// CHECK: ImplClassWithResilientStoredProperty.afterMirrorProperty = 42
175+
// CHECK-RESILIENCE-LABEL: *** ImplClassWithResilientStoredProperty #1 ***
176+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.mirror = nil
177+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.afterMirrorProperty = 0
178+
// CHECK-RESILIENCE-LABEL: *** ImplClassWithResilientStoredProperty #2 ***
179+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.mirror = nil
180+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.afterMirrorProperty = 42
171181
// CHECK-LABEL: *** ImplClass #1 ***
172182
// CHECK: ImplClass.someMethod() = ImplClass
173183
// CHECK: ImplClass.implProperty = 0
@@ -183,16 +193,16 @@ ImplClass.runTests()
183193
// CHECK-LABEL: *** SwiftSubclass init ***
184194
// CHECK: SwiftSubclass.init()
185195
// CHECK: ImplClass.init()
186-
// CHECK-LABEL: *** SwiftResilientStoredSubclass #1 ***
187-
// CHECK: SwiftResilientStoredSubclass.mirror = nil
188-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty = 0
189-
// CHECK: SwiftResilientStoredSubclass.mirror2 = nil
190-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty2 = 1
191-
// CHECK-LABEL: *** SwiftResilientStoredSubclass #2 ***
192-
// CHECK: SwiftResilientStoredSubclass.mirror = nil
193-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty = 42
194-
// CHECK: SwiftResilientStoredSubclass.mirror2 = nil
195-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty2 = 43
196+
// CHECK-RESILIENCE-LABEL: *** SwiftResilientStoredSubclass #1 ***
197+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror = nil
198+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty = 0
199+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror2 = nil
200+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty2 = 1
201+
// CHECK-RESILIENCE-LABEL: *** SwiftResilientStoredSubclass #2 ***
202+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror = nil
203+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty = 42
204+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror2 = nil
205+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty2 = 43
196206
// CHECK-LABEL: *** SwiftSubclass #1 ***
197207
// CHECK: SwiftSubclass.someMethod() = SwiftSubclass
198208
// CHECK: SwiftSubclass.implProperty = 0

test/Interpreter/objc_implementation_objc_client.m

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ int main() {
7777
// CHECK: implFunc(1989)
7878
// CHECK-LABEL: *** ImplClass init ***
7979
// CHECK: ImplClass.init()
80-
// CHECK-LABEL: *** ImplClassWithResilientStoredProperty #1 ***
81-
// CHECK: ImplClassWithResilientStoredProperty.mirror = nil
82-
// CHECK: ImplClassWithResilientStoredProperty.afterMirrorProperty = 0
83-
// CHECK-LABEL: *** ImplClassWithResilientStoredProperty #2 ***
84-
// CHECK: ImplClassWithResilientStoredProperty.mirror = nil
85-
// CHECK: ImplClassWithResilientStoredProperty.afterMirrorProperty = 42
80+
// CHECK-RESILIENCE-LABEL: *** ImplClassWithResilientStoredProperty #1 ***
81+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.mirror = nil
82+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.afterMirrorProperty = 0
83+
// CHECK-RESILIENCE-LABEL: *** ImplClassWithResilientStoredProperty #2 ***
84+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.mirror = nil
85+
// CHECK-RESILIENCE: ImplClassWithResilientStoredProperty.afterMirrorProperty = 42
8686
// CHECK-LABEL: *** ImplClass #1 ***
8787
// CHECK: ImplClass.someMethod() = ImplClass
8888
// CHECK: ImplClass.implProperty = 0
@@ -98,16 +98,16 @@ int main() {
9898
// CHECK-LABEL: *** SwiftSubclass init ***
9999
// CHECK: SwiftSubclass.init()
100100
// CHECK: ImplClass.init()
101-
// CHECK-LABEL: *** SwiftResilientStoredSubclass #1 ***
102-
// CHECK: SwiftResilientStoredSubclass.mirror = nil
103-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty = 0
104-
// CHECK: SwiftResilientStoredSubclass.mirror2 = nil
105-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty2 = 1
106-
// CHECK-LABEL: *** SwiftResilientStoredSubclass #2 ***
107-
// CHECK: SwiftResilientStoredSubclass.mirror = nil
108-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty = 42
109-
// CHECK: SwiftResilientStoredSubclass.mirror2 = nil
110-
// CHECK: SwiftResilientStoredSubclass.afterMirrorProperty2 = 43
101+
// CHECK-RESILIENCE-LABEL: *** SwiftResilientStoredSubclass #1 ***
102+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror = nil
103+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty = 0
104+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror2 = nil
105+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty2 = 1
106+
// CHECK-RESILIENCE-LABEL: *** SwiftResilientStoredSubclass #2 ***
107+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror = nil
108+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty = 42
109+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.mirror2 = nil
110+
// CHECK-RESILIENCE: SwiftResilientStoredSubclass.afterMirrorProperty2 = 43
111111
// CHECK-LABEL: *** SwiftSubclass #1 ***
112112
// CHECK: SwiftSubclass.someMethod() = SwiftSubclass
113113
// CHECK: SwiftSubclass.implProperty = 0
@@ -138,14 +138,14 @@ int main() {
138138
// CHECK-LABEL: *** ObjCClientSubclass init ***
139139
// CHECK: -[ObjCClientSubclass init]
140140
// CHECK: ImplClass.init()
141-
// CHECK-LABEL: *** ObjCClientResilientSubclass #1 ***
142-
// CHECK: ObjCClientResilientSubclass.mirror = nil
143-
// CHECK: ObjCClientResilientSubclass.afterMirrorProperty = 0
144-
// CHECK: ObjCClientResilientSubclass.subclassProperty = 100
145-
// CHECK-LABEL: *** ObjCClientResilientSubclass #2 ***
146-
// CHECK: ObjCClientResilientSubclass.mirror = nil
147-
// CHECK: ObjCClientResilientSubclass.afterMirrorProperty = 42
148-
// CHECK: ObjCClientResilientSubclass.subclassProperty = 101
141+
// CHECK-RESILIENCE-LABEL: *** ObjCClientResilientSubclass #1 ***
142+
// CHECK-RESILIENCE: ObjCClientResilientSubclass.mirror = nil
143+
// CHECK-RESILIENCE: ObjCClientResilientSubclass.afterMirrorProperty = 0
144+
// CHECK-RESILIENCE: ObjCClientResilientSubclass.subclassProperty = 100
145+
// CHECK-RESILIENCE-LABEL: *** ObjCClientResilientSubclass #2 ***
146+
// CHECK-RESILIENCE: ObjCClientResilientSubclass.mirror = nil
147+
// CHECK-RESILIENCE: ObjCClientResilientSubclass.afterMirrorProperty = 42
148+
// CHECK-RESILIENCE: ObjCClientResilientSubclass.subclassProperty = 101
149149
// CHECK-LABEL: *** ObjCClientSubclass #1 ***
150150
// CHECK: ObjCClientSubclass.someMethod() = ObjCClientSubclass
151151
// CHECK: ObjCClientSubclass.implProperty = 0
@@ -194,11 +194,13 @@ int main() {
194194
return 0;
195195
}
196196

197+
#if RESILIENCE
197198
@interface ObjCClientResilientSubclass : ImplClassWithResilientStoredProperty
198199

199200
@property (assign) NSInteger subclassProperty;
200201

201202
@end
203+
#endif
202204

203205
@implementation ObjCClientSubclass
204206

@@ -225,12 +227,15 @@ - (NSString *)someMethod {
225227
return @"ObjCClientSubclass";
226228
}
227229

230+
#if RESILIENCE
228231
+ (ImplClassWithResilientStoredProperty *)makeResilientImpl {
229232
return [ObjCClientResilientSubclass new];
230233
}
234+
#endif
231235

232236
@end
233237

238+
#if RESILIENCE
234239
@implementation ObjCClientResilientSubclass
235240

236241
- (id)init {
@@ -251,3 +256,4 @@ - (void)mutate {
251256
}
252257

253258
@end
259+
#endif
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Variant of Interpreter/objc_implementation.swift that tests resilient stored properties.
2+
// Will not execute correctly without ObjC runtime support.
3+
// REQUIRES: rdar109171643
4+
5+
// RUN: %target-run-simple-swift(-import-objc-header %S/Inputs/objc_implementation.h -D TOP_LEVEL_CODE -D RESILIENCE -swift-version 5 -enable-experimental-feature CImplementation -enable-experimental-feature ObjCImplementationWithResilientStorage -target %target-future-triple) %S/objc_implementation.swift | %FileCheck %S/objc_implementation.swift --check-prefixes CHECK,CHECK-RESILIENCE
6+
// REQUIRES: executable_test
7+
// REQUIRES: objc_interop
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Variant of Interpreter/objc_implementation_objc_client.m that tests resilient stored properties.
2+
// Will not execute correctly without ObjC runtime support.
3+
// REQUIRES: rdar109171643
4+
5+
// REQUIRES-X: rdar101497120
6+
7+
//
8+
// Build objc_implementation.framework
9+
//
10+
// RUN: %empty-directory(%t-frameworks)
11+
// RUN: %empty-directory(%t-frameworks/objc_implementation.framework/Modules/objc_implementation.swiftmodule)
12+
// RUN: %empty-directory(%t-frameworks/objc_implementation.framework/Headers)
13+
// RUN: cp %S/Inputs/objc_implementation.modulemap %t-frameworks/objc_implementation.framework/Modules/module.modulemap
14+
// RUN: cp %S/Inputs/objc_implementation.h %t-frameworks/objc_implementation.framework/Headers
15+
// RUN: %target-build-swift-dylib(%t-frameworks/objc_implementation.framework/objc_implementation) -emit-module-path %t-frameworks/objc_implementation.framework/Modules/objc_implementation.swiftmodule/%module-target-triple.swiftmodule -module-name objc_implementation -F %t-frameworks -import-underlying-module -Xlinker -install_name -Xlinker %t-frameworks/objc_implementation.framework/objc_implementation %S/objc_implementation.swift -D RESILIENCE -enable-experimental-feature CImplementation -enable-experimental-feature ObjCImplementationWithResilientStorage -target %target-future-triple
16+
//
17+
// Execute this file
18+
//
19+
// RUN: %empty-directory(%t)
20+
// RUN: %target-clang %S/objc_implementation_objc_client.m -isysroot %sdk -F %t-frameworks -lobjc -fmodules -fobjc-arc -o %t/objc_implementation_objc_client -D RESILIENCE
21+
// RUN: %target-codesign %t/objc_implementation_objc_client
22+
// RUN: %target-run %t/objc_implementation_objc_client 2>&1 | %FileCheck %S/objc_implementation_objc_client.m --check-prefixes CHECK,CHECK-RESILIENCE
23+
24+
// REQUIRES: executable_test
25+
// REQUIRES: objc_interop
26+
27+
// FIXME: This test fails in Swift CI simulators, but I have not been able to
28+
// reproduce this locally.
29+
// REQUIRES: OS=macosx
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Variant of Interpreter/objc_implementation_swift_client.swift that tests resilient stored properties.
2+
// Will not execute correctly without ObjC runtime support.
3+
// REQUIRES: rdar109171643
4+
5+
// Test doesn't pass on all platforms (rdar://101543397)
6+
// REQUIRES: OS=macosx
7+
// UNSUPPORTED: use_os_stdlib
8+
// UNSUPPORTED: back_deployment_runtime
9+
10+
//
11+
// Build objc_implementation.framework
12+
//
13+
// RUN: %empty-directory(%t)
14+
// RUN: %empty-directory(%t/frameworks)
15+
// RUN: %empty-directory(%t/frameworks/objc_implementation.framework/Modules/objc_implementation.swiftmodule)
16+
// RUN: %empty-directory(%t/frameworks/objc_implementation.framework/Headers)
17+
// RUN: cp %S/Inputs/objc_implementation.modulemap %t/frameworks/objc_implementation.framework/Modules/module.modulemap
18+
// RUN: cp %S/Inputs/objc_implementation.h %t/frameworks/objc_implementation.framework/Headers
19+
// RUN: %target-build-swift-dylib(%t/frameworks/objc_implementation.framework/objc_implementation) -D RESILIENCE -enable-experimental-feature CImplementation -enable-experimental-feature ObjCImplementationWithResilientStorage -target %target-future-triple -emit-module-path %t/frameworks/objc_implementation.framework/Modules/objc_implementation.swiftmodule/%module-target-triple.swiftmodule -module-name objc_implementation -F %t/frameworks -import-underlying-module -Xlinker -install_name -Xlinker %t/frameworks/objc_implementation.framework/objc_implementation %S/objc_implementation.swift
20+
21+
//
22+
// Execute this file
23+
//
24+
// RUN: %empty-directory(%t/swiftmod)
25+
// RUN: %target-build-swift %S/objc_implementation_swift_client.swift -module-cache-path %t/swiftmod/mcp -F %t/frameworks -o %t/swiftmod/a.out -module-name main -D RESILIENCE -enable-experimental-feature ObjCImplementationWithResilientStorage -target %target-future-triple
26+
// RUN: %target-codesign %t/swiftmod/a.out
27+
// RUN: %target-run %t/swiftmod/a.out | %FileCheck %S/objc_implementation_swift_client.swift -check-prefixes CHECK,CHECK-RESILIENCE
28+
29+
//
30+
// Execute again, without the swiftmodule this time
31+
//
32+
// RUN: mv %t/frameworks/objc_implementation.framework/Modules/objc_implementation.swiftmodule %t/frameworks/objc_implementation.framework/Modules/objc_implementation.swiftmodule.disabled
33+
// RUN: %empty-directory(%t/clangmod)
34+
// RUN: %target-build-swift %S/objc_implementation_swift_client.swift -module-cache-path %t/clangmod/mcp -F %t/frameworks -o %t/clangmod/a.out -module-name main -D RESILIENCE -enable-experimental-feature ObjCImplementationWithResilientStorage -target %target-future-triple
35+
// RUN: %target-codesign %t/clangmod/a.out
36+
// RUN: %target-run %t/clangmod/a.out | %FileCheck %S/objc_implementation_swift_client.swift --check-prefixes CHECK,CHECK-RESILIENCE
37+
38+
// REQUIRES: executable_test
39+
// REQUIRES: objc_interop

0 commit comments

Comments
 (0)