forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow inheritance from resilient classes with missing members
When a class has missing vtable entries, we don’t allow it to be subclassed. This is unnecessarily restrictive for resilient classes, and @_implementationOnly imports now make missing vtable entries much more common. This commit carves out an exception to that rule for resilient classes. Fixes <rdar://problem/50902125>.
- Loading branch information
Showing
2 changed files
with
55 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
// RUN: %empty-directory(%t) | ||
|
||
// For convenience, this file includes the three different "files" used in this | ||
// test. It selects one with -DCoreDishwasher, -DDishwasherKit, or neither. | ||
|
||
// RUN: %target-swift-frontend -emit-module %s -DCoreDishwasher -module-name CoreDishwasher -o %t/CoreDishwasher -emit-module-path %t/CoreDishwasher.swiftmodule -I %t | ||
// RUN: %target-swift-frontend -emit-module %s -DDishwasherKit -module-name DishwasherKit -o %t/DishwasherKit -emit-module-path %t/DishwasherKit.swiftmodule -enable-library-evolution -I %t | ||
// RUN: %target-typecheck-verify-swift -I %t | ||
|
||
#if CoreDishwasher | ||
|
||
public struct SpimsterWicket { | ||
public init() {} | ||
} | ||
|
||
#elseif DishwasherKit | ||
|
||
@_implementationOnly import CoreDishwasher | ||
|
||
open class Dishwasher { | ||
public init() {} | ||
|
||
var wicket = SpimsterWicket() | ||
|
||
open var modelName: String { "Dishwasher" } | ||
} | ||
|
||
open class NoUserServiceablePartsInside { | ||
public init() {} | ||
internal init(wicket: SpimsterWicket) {} | ||
public convenience init(inconvenient: ()) { | ||
self.init() | ||
} | ||
} | ||
|
||
#else | ||
|
||
import DishwasherKit | ||
|
||
class FancyDishwasher: Dishwasher { | ||
override var modelName: String { "Fancy \(super.modelName)" } | ||
} | ||
|
||
class VoidedWarranty: NoUserServiceablePartsInside { | ||
override init() { super.init() } | ||
} | ||
|
||
// FIXME: This diagnostic should be better, but it matches what we're already | ||
// doing for disallowed convenience inits. | ||
let notAllowed = VoidedWarranty(inconvenient: ()) // expected-error{{argument passed to call that takes no arguments}} | ||
|
||
#endif |