Skip to content

Commit 3e791dd

Browse files
committed
[CSClosure] Use correct type for implicit wrapper variables
Using `computeWrappedValueType` is incorrect because that return a type of the wrapped variable and not the *wrapper* variable (one that starts with `_`). Resolves: #61017
1 parent 86c7f9f commit 3e791dd

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

lib/Sema/CSClosure.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class TypeVariableRefFinder : public ASTWalker {
113113
CS.setType(var, computeProjectedValueType(wrappedVar, wrapperType));
114114
} else {
115115
// _<name> is the wrapper var
116-
CS.setType(var, computeWrappedValueType(wrappedVar, wrapperType));
116+
CS.setType(var, wrapperType);
117117
}
118118

119119
return {true, expr};

test/expr/closure/multi_statement.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,3 +566,22 @@ struct Test {
566566
}
567567
}
568568
}
569+
570+
https://github.com/apple/swift/issues/61017
571+
do {
572+
@propertyWrapper
573+
struct Wrapper {
574+
var wrappedValue: Int
575+
576+
init(wrappedValue: Int) {
577+
self.wrappedValue = wrappedValue
578+
}
579+
}
580+
581+
class Test {
582+
let bar: () -> Void = {
583+
@Wrapper var wrapped = 1
584+
let wrapper: Wrapper = _wrapped // Ok
585+
}
586+
}
587+
}

validation-test/Sema/type_checker_crashers_fixed/issue59294.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class Test {
7474
if $value.returnValue() > 0 {
7575
test {
7676
return $value.returnValue() == $0 &&
77-
_value == $0
77+
_value.wrappedValue == $0
7878
}
7979
}
8080
return false
@@ -84,7 +84,7 @@ class Test {
8484
@WrapperValue var value = $0
8585

8686
test {
87-
if _value != $0 { // Ok
87+
if _value.wrappedValue != $0 { // Ok
8888
$value.printValue()
8989
}
9090
}
@@ -99,7 +99,8 @@ class Test {
9999
if true {
100100
@OuterWrapper @WrapperValue var value = $0
101101
if true {
102-
let _: Bool = _value == $0
102+
let _: OuterWrapper<WrapperValue<Bool>> = _value
103+
let _ = _value.wrappedValue.wrappedValue == $0
103104
let _: OuterWrapper<WrapperValue<Bool>> = $value
104105
let _: Bool = value
105106
}

0 commit comments

Comments
 (0)