File tree Expand file tree Collapse file tree 3 files changed +47
-11
lines changed
Inputs/inherited-objc-initializers Expand file tree Collapse file tree 3 files changed +47
-11
lines changed Original file line number Diff line number Diff line change @@ -360,6 +360,27 @@ static bool isInsideCompatibleUnavailableDeclaration(
360
360
inheritsAvailabilityFromPlatform (platform, *referencedPlatform));
361
361
}
362
362
363
+ static bool shouldAllowReferenceToUnavailableInSwiftDeclaration (
364
+ const Decl *D, const ExportContext &where) {
365
+ auto *DC = where.getDeclContext ();
366
+ auto *SF = DC->getParentSourceFile ();
367
+
368
+ // Unavailable-in-Swift declarations shouldn't be referenced directly in
369
+ // source. However, they can be referenced in implicit declarations that are
370
+ // printed in .swiftinterfaces.
371
+ if (!SF || SF->Kind != SourceFileKind::Interface)
372
+ return false ;
373
+
374
+ if (auto constructor = dyn_cast_or_null<ConstructorDecl>(DC->getAsDecl ())) {
375
+ // Designated initializers inherited from an Obj-C superclass may have
376
+ // parameters that are unavailable-in-Swift.
377
+ if (constructor->isObjC ())
378
+ return true ;
379
+ }
380
+
381
+ return false ;
382
+ }
383
+
363
384
namespace {
364
385
365
386
// / A class to walk the AST to build the type refinement context hierarchy.
@@ -3038,7 +3059,9 @@ bool swift::diagnoseExplicitUnavailability(
3038
3059
break ;
3039
3060
3040
3061
case PlatformAgnosticAvailabilityKind::UnavailableInSwift:
3041
- // This API is explicitly unavailable in Swift.
3062
+ if (shouldAllowReferenceToUnavailableInSwiftDeclaration (D, Where))
3063
+ return true ;
3064
+
3042
3065
platform = " Swift" ;
3043
3066
break ;
3044
3067
}
Original file line number Diff line number Diff line change 1
1
#import < Foundation/Foundation.h>
2
2
3
- @interface FrameworkObject : NSObject
4
- - (nonnull instancetype )initWithInvocation : (nullable NSInvocation *)invocation NS_SWIFT_UNAVAILABLE(" unavailable" );
5
- - (nonnull instancetype )initWithSelector : (nonnull SEL )selector ;
6
- - (nonnull instancetype )initWithInteger : (NSInteger )integer ;
3
+ NS_SWIFT_UNAVAILABLE (" unavailable" )
4
+ @interface UnavailableInSwift : NSObject
7
5
@end
6
+
7
+ @interface HasAvailableInit : NSObject
8
+ - (nonnull instancetype )initWithUnavailable:(nonnull UnavailableInSwift *)unavailable;
9
+ @end
10
+
11
+ @interface HasUnavailableInit : NSObject
12
+ - (nonnull instancetype )initWithUnavailable : (nonnull UnavailableInSwift *)unavailable NS_SWIFT_UNAVAILABLE(" unavailable" );
13
+ @end
14
+
Original file line number Diff line number Diff line change 1
- // RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -I %S/Inputs/inherited-objc-initializers/
2
- // RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -I %S/Inputs/inherited-objc-initializers/
1
+ // RUN: %target-swift-emit-module-interface(%t.swiftinterface) %s -I %S/Inputs/inherited-objc-initializers/ -module-name Test
2
+ // RUN: %target-swift-typecheck-module-from-interface(%t.swiftinterface) -I %S/Inputs/inherited-objc-initializers/ -module-name Test
3
3
// RUN: %FileCheck %s < %t.swiftinterface
4
4
5
5
// REQUIRES: objc_interop
6
6
7
7
import InheritedObjCInits
8
8
9
- // CHECK: @objc @_inheritsConvenienceInitializers public class Subclass : InheritedObjCInits.FrameworkObject {
10
- public class Subclass : FrameworkObject {
11
- // CHECK-NEXT: @objc override dynamic public init(selector: ObjectiveC.Selector)
12
- // CHECK-NEXT: @objc override dynamic public init(integer: Swift.Int)
9
+ // CHECK: @objc @_inheritsConvenienceInitializers public class Subclass2 : InheritedObjCInits.HasAvailableInit {
10
+ public class Subclass2 : HasAvailableInit {
11
+ // CHECK-NEXT: @objc override dynamic public init(unavailable: InheritedObjCInits.UnavailableInSwift)
12
+ // CHECK-NEXT: @objc override dynamic public init()
13
+ // CHECK-NEXT: @objc deinit
14
+ } // CHECK-NEXT:{{^}$}}
15
+
16
+ // CHECK: @objc @_inheritsConvenienceInitializers public class Subclass1 : InheritedObjCInits.HasUnavailableInit {
17
+ public class Subclass1 : HasUnavailableInit {
18
+ // CHECK-NOT: InheritedObjCInits.UnavailableInSwift
13
19
// CHECK-NEXT: @objc override dynamic public init()
14
20
// CHECK-NEXT: @objc deinit
15
21
} // CHECK-NEXT:{{^}$}}
You can’t perform that action at this time.
0 commit comments