Merge pull request #7378 from jrose-apple/3.1-TypeLoc-willSet-didSet
When setting a willSet/didSet param's type, also set the TypeLoc
diff --git a/lib/Sema/TypeCheckDecl.cpp b/lib/Sema/TypeCheckDecl.cpp
index 8acfaad..275dac3 100644
--- a/lib/Sema/TypeCheckDecl.cpp
+++ b/lib/Sema/TypeCheckDecl.cpp
@@ -4787,6 +4787,7 @@
auto *newValueParam = firstParamPattern->get(0);
newValueParam->setType(valueTy);
newValueParam->setInterfaceType(valueIfaceTy);
+ newValueParam->getTypeLoc().setType(valueTy);
} else if (FD->isGetter() && FD->isImplicit()) {
FD->getBodyResultTypeLoc().setType(valueIfaceTy, true);
}
diff --git a/test/decl/var/properties.swift b/test/decl/var/properties.swift
index 604248c..b8431dd 100644
--- a/test/decl/var/properties.swift
+++ b/test/decl/var/properties.swift
@@ -1187,3 +1187,40 @@
}
+// https://bugs.swift.org/browse/SR-3893
+// Generic type is not inferenced from its initial value for properties with
+// will/didSet
+struct SR3893Box<Foo> {
+ let value: Foo
+}
+
+struct SR3893 {
+ // Each of these "bad" properties used to produce errors.
+ var bad: SR3893Box = SR3893Box(value: 0) {
+ willSet {
+ print(newValue.value)
+ }
+ }
+
+ var bad2: SR3893Box = SR3893Box(value: 0) {
+ willSet(new) {
+ print(new.value)
+ }
+ }
+
+ var bad3: SR3893Box = SR3893Box(value: 0) {
+ didSet {
+ print(oldValue.value)
+ }
+ }
+
+ var good: SR3893Box<Int> = SR3893Box(value: 0) {
+ didSet {
+ print(oldValue.value)
+ }
+ }
+
+ var plain: SR3893Box = SR3893Box(value: 0)
+}
+
+