mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
In Swift 4, properties declared with a sugared Optional type, like Int?, have a default value of nil. This can be observed in two ways: - Classes and structs get an implicit no-argument initializer - Designated initializers don't have to initialize this property Note that this did not apply in general to properties where the type was spelled explicitly as Optional<Int>, etc, mostly because of implementation restrictions -- when we check if a type has implicit initializers, we have not realized types for all stored property members yet, and doing so is not really possible without the iterative decl checker. However, in some cases, we *did* perform default initialization for Optional<Int>, because of some code duplication and divergent code paths. A recent refactoring cleaned up some of the mess in this area, but accidentally broke source compatibility with code that relied on the broken Optional<Int> case. Fix this by simulating the old behavior in -swift-version 4, and preserving the more correct behavior in -swift-version 5. Fixes <rdar://problem/35319847>.
17 lines
521 B
Swift
17 lines
521 B
Swift
// RUN: %target-swift-frontend -typecheck -parse-as-library %s -verify -swift-version 4
|
|
|
|
// Default initialization of variables -- totally broken Swift 4 behavior.
|
|
|
|
class NotInitializableOptionalClass {
|
|
var opt: Optional<Int>
|
|
}
|
|
|
|
struct NotInitializableOptionalStruct { // expected-note {{'init(opt:)' declared here}}
|
|
var opt: Optional<Int>
|
|
}
|
|
|
|
func testBadDefaultInit() {
|
|
_ = NotInitializableOptionalStruct() // expected-error {{missing argument for parameter 'opt' in call}}
|
|
_ = NotInitializableOptionalClass()
|
|
}
|