File tree Expand file tree Collapse file tree 2 files changed +53
-0
lines changed
validation-test/Sema/type_checker_crashers_fixed Expand file tree Collapse file tree 2 files changed +53
-0
lines changed Original file line number Diff line number Diff line change @@ -2229,6 +2229,22 @@ void ConjunctionElement::findReferencedVariables(
2229
2229
2230
2230
TypeVariableRefFinder refFinder (cs, locator->getAnchor (), typeVars);
2231
2231
2232
+ // If this is a pattern of `for-in` statement, let's walk into `for-in`
2233
+ // sequence expression because both elements are type-checked together.
2234
+ //
2235
+ // Correct expressions wouldn't have any type variables in sequence but
2236
+ // they could appear due to circular references or other incorrect syntax.
2237
+ if (element.is <Pattern *>()) {
2238
+ if (auto parent =
2239
+ locator->getLastElementAs <LocatorPathElt::SyntacticElement>()) {
2240
+ if (auto *forEach = getAsStmt<ForEachStmt>(parent->getElement ())) {
2241
+ if (auto *sequence = forEach->getParsedSequence ())
2242
+ sequence->walk (refFinder);
2243
+ return ;
2244
+ }
2245
+ }
2246
+ }
2247
+
2232
2248
if (auto *patternBinding =
2233
2249
dyn_cast_or_null<PatternBindingDecl>(element.dyn_cast <Decl *>())) {
2234
2250
// Let's not walk into placeholder variable initializers, since they
Original file line number Diff line number Diff line change
1
+ // RUN: %target-typecheck-verify-swift
2
+
3
+ struct Location {
4
+ var host : String ?
5
+ }
6
+
7
+ struct Data : Hashable {
8
+ func location( ) -> Location {
9
+ fatalError ( )
10
+ }
11
+ }
12
+
13
+ struct Test { // expected-note {{to match this opening '{'}}
14
+ private struct Info {
15
+ var data = Set < Data > ( )
16
+ var desc : String
17
+ }
18
+
19
+ static func print( data: [ Data ] ) {
20
+ var infos = [ Info] ( )
21
+
22
+ for (index, info) in infos. enumerated ( ) {
23
+ let dataPerHost = Dictionary ( grouping: info. data) { data in
24
+ let location = data. location ( )
25
+ guard let host = location. host else {
26
+ return 0
27
+ }
28
+
29
+ for character in host {
30
+ // Missing paren!
31
+ }
32
+
33
+ for _ in dataPerHost { // `dataPerHost` is inside of the closure!
34
+ }
35
+ }
36
+ }
37
+ } // expected-error@+1 {{expected '}' in struct}}
You can’t perform that action at this time.
0 commit comments