File tree Expand file tree Collapse file tree 2 files changed +40
-6
lines changed Expand file tree Collapse file tree 2 files changed +40
-6
lines changed Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments