Skip to content

Commit 67c0fd8

Browse files
authored
Merge pull request #74133 from DougGregor/mutable-lets-in-inits-tweaks
Tweak "initializable values" logic slightly to address source incompatibilities
2 parents 79075e9 + 62558b0 commit 67c0fd8

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

lib/AST/Decl.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7404,10 +7404,10 @@ 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.
7407+
// If we're referencing 'self.', it's mutable.
74087408
if (!base ||
74097409
(*base && ctor->getImplicitSelfDecl() == (*base)->getDecl()))
7410-
return StorageMutability::Initializable;
7410+
return StorageMutability::Mutable;
74117411

74127412
return storageIsMutable(supportsMutation());
74137413
}
@@ -7475,8 +7475,14 @@ VarDecl::mutability(const DeclContext *UseDC,
74757475
return StorageMutability::Immutable;
74767476

74777477
// If we were given a base and it is 'self', it's initializable.
7478-
if (!base || (*base && CD->getImplicitSelfDecl() == (*base)->getDecl()))
7478+
if (!base || (*base && CD->getImplicitSelfDecl() == (*base)->getDecl())) {
7479+
// Treat values of tuple type as mutable in these contexts, because
7480+
// SILGen wants to see them as lvalues.
7481+
if (getInterfaceType()->is<TupleType>())
7482+
return StorageMutability::Mutable;
7483+
74797484
return StorageMutability::Initializable;
7485+
}
74807486

74817487
return StorageMutability::Immutable;
74827488
}

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)