Skip to content

Commit c9adb5b

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: swiftlang#61017 (cherry picked from commit 3e791dd)
1 parent 15a3ff6 commit c9adb5b

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
@@ -109,7 +109,7 @@ class TypeVariableRefFinder : public ASTWalker {
109109
CS.setType(var, computeProjectedValueType(wrappedVar, wrapperType));
110110
} else {
111111
// _<name> is the wrapper var
112-
CS.setType(var, computeWrappedValueType(wrappedVar, wrapperType));
112+
CS.setType(var, wrapperType);
113113
}
114114

115115
return {true, expr};

test/expr/closure/multi_statement.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,3 +535,22 @@ struct Test {
535535
}
536536
}
537537
}
538+
539+
https://github.com/apple/swift/issues/61017
540+
do {
541+
@propertyWrapper
542+
struct Wrapper {
543+
var wrappedValue: Int
544+
545+
init(wrappedValue: Int) {
546+
self.wrappedValue = wrappedValue
547+
}
548+
}
549+
550+
class Test {
551+
let bar: () -> Void = {
552+
@Wrapper var wrapped = 1
553+
let wrapper: Wrapper = _wrapped // Ok
554+
}
555+
}
556+
}

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)