Skip to content

Commit 6a8eabf

Browse files
committed
Tweak "initializable values" logic slightly to address source incompatibilities
Back of slightly on when we treat a "let" instance property as immutable within an initializer, to deal with two newly-introduced source incompatibilities. Fixes rdar://129253556.
1 parent 365f811 commit 6a8eabf

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

lib/AST/Decl.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7404,11 +7404,6 @@ VarDecl::mutability(const DeclContext *UseDC,
74047404
if (!isLet()) {
74057405
if (hasInitAccessor()) {
74067406
if (auto *ctor = dyn_cast_or_null<ConstructorDecl>(UseDC)) {
7407-
// If we're referencing 'self.', it's initializable.
7408-
if (!base ||
7409-
(*base && ctor->getImplicitSelfDecl() == (*base)->getDecl()))
7410-
return StorageMutability::Initializable;
7411-
74127407
return storageIsMutable(supportsMutation());
74137408
}
74147409
}
@@ -7475,8 +7470,14 @@ VarDecl::mutability(const DeclContext *UseDC,
74757470
return StorageMutability::Immutable;
74767471

74777472
// If we were given a base and it is 'self', it's initializable.
7478-
if (!base || (*base && CD->getImplicitSelfDecl() == (*base)->getDecl()))
7473+
if (!base || (*base && CD->getImplicitSelfDecl() == (*base)->getDecl())) {
7474+
// Treat values of tuple type as mutable in these contexts, because
7475+
// SILGen wants to see them as lvalues.
7476+
if (getInterfaceType()->is<TupleType>())
7477+
return StorageMutability::Mutable;
7478+
74797479
return StorageMutability::Initializable;
7480+
}
74807481

74817482
return StorageMutability::Immutable;
74827483
}

test/SILOptimizer/definite_init_diagnostics.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1614,3 +1614,36 @@ class DerivedWrappedProperty : SomeClass {
16141614
} // expected-error {{'super.init' isn't called on all paths before returning from initializer}}
16151615

16161616
}
1617+
1618+
// rdar://129031705 ([error: ... used before being initialized)
1619+
// Related to treating 'let's as immutable RValues.
1620+
struct S {
1621+
let rotation: (Int, Int)
1622+
1623+
init() {
1624+
rotation.0 = 0
1625+
rotation.1 = rotation.0
1626+
}
1627+
}
1628+
1629+
// rdar://128890586: Init accessors
1630+
final class HasInitAccessors {
1631+
private var _ints: [Int] = []
1632+
1633+
private var ints: [Int] {
1634+
@storageRestrictions(initializes: _ints)
1635+
init(initialValue) {
1636+
_ints = initialValue
1637+
}
1638+
get {
1639+
return _ints
1640+
}
1641+
set {
1642+
_ints = newValue
1643+
}
1644+
}
1645+
1646+
init() {
1647+
ints.append(0)
1648+
}
1649+
}

0 commit comments

Comments
 (0)