| // swift-interface-format-version: 1.0 |
| // swift-module-flags: -module-name InheritedDefaults |
| |
| // RUN: %empty-directory(%t) |
| // RUN: %target-typecheck-verify-swift |
| |
| import Swift |
| |
| public class Bar { |
| // note associated with the expected error in (F) below |
| public init(x: Int = 24, y: Int, z: Int = 42) // expected-note {{corresponding parameter declared here}} |
| |
| public init(a: Int, b: Int = 99) |
| public convenience init(convInit: Int = 45) {} |
| |
| // note associated with the expected error in (D) below |
| public convenience init(first: Int, second: Int = 88, third: Int, fourth: Int) // expected-note {{overridden declaration is here}} |
| } |
| |
| public class Foo: Bar { |
| |
| // A) designated overriding designated - valid |
| public override init(x: Int = super, y: Int, z: Int = super) |
| |
| // B) convenience shadowing convenience |
| public convenience init(convInit: Int = super) // expected-error {{default value inheritance via 'super' is only valid on the parameters of designated initializers}} |
| |
| // C) convenience overriding designated |
| public override convenience init(a: Int, b: Int = super) // expected-error {{default value inheritance via 'super' is only valid on the parameters of designated initializers}} |
| |
| // D) designated shadowing convenience |
| public init(first: Int, second: Int = super, third: Int, fourth: Int) // expected-error {{default value inheritance via 'super' can only be used when overriding a designated initializer}} |
| |
| // E) not in initializer |
| public subscript(k: Int = super) -> Int { get } // expected-error {{default value inheritance via 'super' is only valid on the parameters of designated initializers}} |
| public func foo(z: Int = super) // expected-error {{default value inheritance via 'super' is only valid on the parameters of designated initializers}} |
| } |
| |
| public class Baz: Bar { |
| |
| // F) Matching param not defaulted |
| public override init(x: Int = super, y: Int = super, z: Int = super) // expected-error {{default value inheritance via 'super' requires that the corresponding parameter of the overridden designated initializer has a default value}} |
| } |
| |
| public class Direct: Bar { |
| public override init(x: Int = super, y: Int, z: Int = super) |
| |
| // G) Doesn't override anything |
| public override init(other: Int = super, value: Int) // expected-error {{argument labels for initializer 'init(other:value:)' do not match those of overridden initializer 'init(a:b:)'}} |
| // expected-error@-1 {{default value inheritance via 'super' can only be used when overriding a designated initializer}} |
| } |
| |
| public class Indirect: Direct { |
| |
| // H) Chain of inherited defaults - valid all the way down |
| public override init(x: Int = super, y: Int, z: Int = super) |
| |
| // I) Chain of inherited defaults - invalid further down (and diagnosed there) |
| public override init(other: Int = super, value: Int) |
| } |
| |
| public enum Bob { |
| case bar(p: Int) |
| public init(foo: String = super /*comment*/) // expected-error {{default value inheritance via 'super' can only be used when overriding a designated initializer}} |
| } |