diff --git a/lib/Sema/CSGen.cpp b/lib/Sema/CSGen.cpp index 867a9f74ba1d6..c9cb7ed030ef6 100644 --- a/lib/Sema/CSGen.cpp +++ b/lib/Sema/CSGen.cpp @@ -2949,10 +2949,6 @@ namespace { PreWalkAction walkToDeclPre(Decl *D) override { return Action::VisitChildrenIf(isa(D)); } - - PreWalkResult walkToPatternPre(Pattern *P) override { - return Action::SkipChildren(P); - } } collectVarRefs(CS); // Walk the capture list if this closure has one, because it could diff --git a/lib/Sema/CSSyntacticElement.cpp b/lib/Sema/CSSyntacticElement.cpp index f2d878c1c2702..982e3ee3cc508 100644 --- a/lib/Sema/CSSyntacticElement.cpp +++ b/lib/Sema/CSSyntacticElement.cpp @@ -2625,8 +2625,10 @@ void ConjunctionElement::findReferencedVariables( } if (element.is() || element.is() || - element.is() || element.isStmt(StmtKind::Return)) + element.is() || element.isPattern(PatternKind::Expr) || + element.isStmt(StmtKind::Return)) { element.walk(refFinder); + } } Type constraints::isPlaceholderVar(PatternBindingDecl *PB) { diff --git a/test/Constraints/issue-66561.swift b/test/Constraints/issue-66561.swift new file mode 100644 index 0000000000000..e1293ff0f6c47 --- /dev/null +++ b/test/Constraints/issue-66561.swift @@ -0,0 +1,36 @@ +// RUN: %target-typecheck-verify-swift + +// https://github.com/apple/swift/issues/66561 + +@propertyWrapper +struct WrapperValue { + var value: Value + init(wrappedValue: Value) { + self.value = wrappedValue + } + + var projectedValue: Self { + return self + } + + var wrappedValue: Value { + get { + self.value + } + set { + self.value = newValue + } + } +} + +func test() { + let _ = { + @WrapperValue var value: Bool = false + switch value { + case $value.wrappedValue: + break + default: + break + } + } +} diff --git a/test/Constraints/rdar110617471.swift b/test/Constraints/rdar110617471.swift new file mode 100644 index 0000000000000..305197320f2ec --- /dev/null +++ b/test/Constraints/rdar110617471.swift @@ -0,0 +1,25 @@ +// RUN: %target-typecheck-verify-swift + +// rdar://110617471: Make sure we can type-check this. +class C { + var prop = 0 +} + +func foo(_ fn: () -> Void) {} + +class D { + let c = C() + + func bar() { + foo { [c] in + foo { + switch 0 { + case c.prop: + break + default: + break + } + } + } + } +}