Skip to content

Commit af649e7

Browse files
authored
Merge pull request swiftlang#37143 from hborla/wrapped-parameter-mutability
[Property Wrappers] Always make sure the storage for a wrapped parameter is immutable.
2 parents 29769bd + d8b5d7d commit af649e7

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

lib/Sema/TypeCheckStorage.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2776,8 +2776,9 @@ PropertyWrapperAuxiliaryVariablesRequest::evaluate(Evaluator &evaluator,
27762776
backingVar = ParamDecl::cloneWithoutType(ctx, param);
27772777
backingVar->setName(name);
27782778
} else {
2779+
auto introducer = isa<ParamDecl>(var) ? VarDecl::Introducer::Let : VarDecl::Introducer::Var;
27792780
backingVar = new (ctx) VarDecl(/*IsStatic=*/var->isStatic(),
2780-
VarDecl::Introducer::Var,
2781+
introducer,
27812782
var->getLoc(),
27822783
name, dc);
27832784
backingVar->setImplicit();

test/SILGen/property_wrapper_parameter.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,28 +123,28 @@ class ClassWrapper<Value> {
123123

124124
// CHECK-LABEL: sil hidden [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitF : $@convention(thin) (@guaranteed String, Int) -> ()
125125
func testNonMutatingSetter(@NonMutatingSetterWrapper value1: String, @ClassWrapper value2: Int) {
126-
// CHECK: alloc_box ${ var NonMutatingSetterWrapper<String> }, var, name "_value1"
127126
// CHECK: function_ref @$s26property_wrapper_parameter24NonMutatingSetterWrapperV12wrappedValueACyxGx_tcfC : $@convention(method) <τ_0_0> (@in τ_0_0, @thin NonMutatingSetterWrapper<τ_0_0>.Type) -> @out NonMutatingSetterWrapper<τ_0_0>
128-
// CHECK: alloc_box ${ var ClassWrapper<Int> }, var, name "_value2"
127+
// CHECK: debug_value {{.*}} : $NonMutatingSetterWrapper<String>, let, name "_value1"
129128
// CHECK: function_ref @$s26property_wrapper_parameter12ClassWrapperC12wrappedValueACyxGx_tcfC : $@convention(method) <τ_0_0> (@in τ_0_0, @thick ClassWrapper<τ_0_0>.Type) -> @owned ClassWrapper<τ_0_0>
129+
// CHECK: debug_value {{.*}} : $ClassWrapper<Int>, let, name "_value2"
130130

131131
_ = value1
132132
value1 = "hello!"
133133

134134
// getter of value1 #1 in testNonMutatingSetter(value1:value2:)
135-
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFACL_SSvg : $@convention(thin) (@guaranteed { var NonMutatingSetterWrapper<String> }) -> @owned String
135+
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFACL_SSvg : $@convention(thin) (@guaranteed NonMutatingSetterWrapper<String>) -> @owned String
136136

137137
// setter of value1 #1 in testNonMutatingSetter(value1:value2:)
138-
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFACL_SSvs : $@convention(thin) (@owned String, @guaranteed { var NonMutatingSetterWrapper<String> }) -> ()
138+
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFACL_SSvs : $@convention(thin) (@owned String, @guaranteed NonMutatingSetterWrapper<String>) -> ()
139139

140140
_ = value2
141141
value2 = 10
142142

143143
// getter of value2 #1 in testNonMutatingSetter(value1:value2:)
144-
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFADL_Sivg : $@convention(thin) (@guaranteed { var ClassWrapper<Int> }) -> Int
144+
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFADL_Sivg : $@convention(thin) (@guaranteed ClassWrapper<Int>) -> Int
145145

146146
// setter of value2 #1 in testNonMutatingSetter(value1:value2:)
147-
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFADL_Sivs : $@convention(thin) (Int, @guaranteed { var ClassWrapper<Int> }) -> ()
147+
// CHECK: sil private [ossa] @$s26property_wrapper_parameter21testNonMutatingSetter6value16value2ySS_SitFADL_Sivs : $@convention(thin) (Int, @guaranteed ClassWrapper<Int>) -> ()
148148
}
149149

150150
@propertyWrapper

test/Sema/property_wrapper_parameter_invalid.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ struct InternalWrapper<T> { // expected-note 3 {{type declared here}}
144144
init(wrappedValue: T) { self.wrappedValue = wrappedValue }
145145
}
146146

147+
func testWrapperStorageMutability(@InternalWrapper value: Int) {
148+
_ = _value
149+
// expected-error@+1 {{cannot assign to value: '_value' is immutable}}
150+
_value = InternalWrapper(wrappedValue: 10)
151+
}
152+
147153
// expected-error@+1 {{function cannot be declared public because its parameter uses an internal API wrapper type}}
148154
public func testComposition1(@PublicWrapper @InternalWrapper value: Int) {}
149155

0 commit comments

Comments
 (0)