Files
swift-mirror/test/decl/class/override-implementationOnly.swift
Brent Royal-Gordon 9117c5728a 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>.
2019-05-17 20:05:19 -07:00

53 lines
1.5 KiB
Swift

// 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