Skip to content

Commit bc18787

Browse files
asashourCommit Queue
authored andcommitted
[cfe] fix compiler crash with records
Fixes #51376 Change-Id: I8bf8a6c3ad1f2c34f8d4d6a26b48ab4c125d06b8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/282602 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent d4a73e3 commit bc18787

10 files changed

+150
-1
lines changed

pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2261,7 +2261,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
22612261
element,
22622262
element.variable,
22632263
element.iterable,
2264-
element.syntheticAssignment!,
2264+
element.syntheticAssignment,
22652265
element.expressionEffects,
22662266
isAsync: element.isAsync,
22672267
hasProblem: element.problem != null);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
void main() {
6+
left([(1,2), (3, 4)]);
7+
}
8+
9+
List<A> left<A, B>(List<(A, B)> pairs) => [for (var (a, _) in pairs) a];
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method main() → void {
7+
self::left<core::int, core::int>(<(core::int, core::int)>[(1, 2), (3, 4)]);
8+
}
9+
static method left<A extends core::Object? = dynamic, B extends core::Object? = dynamic>(core::List<(self::left::A%, self::left::B%)> pairs) → core::List<self::left::A%>
10+
return block {
11+
final core::List<self::left::A%> #t1 = <self::left::A%>[];
12+
for (final(self::left::A%, self::left::B%) #t2 in pairs) {
13+
self::left::A% a;
14+
{
15+
final dynamic #0#0 = #t2;
16+
if(!((let final dynamic #t3 = a = #0#0{(self::left::A%, self::left::B%)}.$1{self::left::A%} in true) && true))
17+
throw new _in::ReachabilityError::•();
18+
}
19+
#t1.{core::List::add}{Invariant}(a){(self::left::A%) → void};
20+
}
21+
} =>#t1;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method main() → void {
7+
self::left<core::int, core::int>(core::_GrowableList::_literal2<(core::int, core::int)>((1, 2), (3, 4)));
8+
}
9+
static method left<A extends core::Object? = dynamic, B extends core::Object? = dynamic>(core::List<(self::left::A%, self::left::B%)> pairs) → core::List<self::left::A%>
10+
return block {
11+
final core::List<self::left::A%> #t1 = core::_GrowableList::•<self::left::A%>(0);
12+
{
13+
core::Iterator<(self::left::A%, self::left::B%)> :sync-for-iterator = pairs.{core::Iterable::iterator}{core::Iterator<(self::left::A%, self::left::B%)>};
14+
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
15+
final(self::left::A%, self::left::B%) #t2 = :sync-for-iterator.{core::Iterator::current}{(self::left::A%, self::left::B%)};
16+
{
17+
self::left::A% a;
18+
{
19+
final dynamic #0#0 = #t2;
20+
if(!((let final self::left::A% #t3 = a = #0#0{(self::left::A%, self::left::B%)}.$1{self::left::A%} in true) && true))
21+
throw new _in::ReachabilityError::•();
22+
}
23+
#t1.{core::List::add}{Invariant}(a){(self::left::A%) → void};
24+
}
25+
}
26+
}
27+
} =>#t1;
28+
29+
30+
Extra constant evaluation status:
31+
Evaluated: RecordLiteral @ org-dartlang-testcase:///for_in_without_variable.dart:6:9 -> RecordConstant(const (1, 2))
32+
Evaluated: RecordLiteral @ org-dartlang-testcase:///for_in_without_variable.dart:6:16 -> RecordConstant(const (3, 4))
33+
Extra constant evaluation: evaluated: 25, effectively constant: 2
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
void main() {}
2+
List<A> left<A, B>(List<(A, B)> pairs) => [for (var (;a;, _) in pairs) a];
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method main() → void {
7+
self::left<core::int, core::int>(<(core::int, core::int)>[(1, 2), (3, 4)]);
8+
}
9+
static method left<A extends core::Object? = dynamic, B extends core::Object? = dynamic>(core::List<(self::left::A%, self::left::B%)> pairs) → core::List<self::left::A%>
10+
return block {
11+
final core::List<self::left::A%> #t1 = <self::left::A%>[];
12+
for (final(self::left::A%, self::left::B%) #t2 in pairs) {
13+
self::left::A% a;
14+
{
15+
final dynamic #0#0 = #t2;
16+
if(!((let final dynamic #t3 = a = #0#0{(self::left::A%, self::left::B%)}.$1{self::left::A%} in true) && true))
17+
throw new _in::ReachabilityError::•();
18+
}
19+
#t1.{core::List::add}{Invariant}(a){(self::left::A%) → void};
20+
}
21+
} =>#t1;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method main() → void {
7+
self::left<core::int, core::int>(<(core::int, core::int)>[(1, 2), (3, 4)]);
8+
}
9+
static method left<A extends core::Object? = dynamic, B extends core::Object? = dynamic>(core::List<(self::left::A%, self::left::B%)> pairs) → core::List<self::left::A%>
10+
return block {
11+
final core::List<self::left::A%> #t1 = <self::left::A%>[];
12+
for (final(self::left::A%, self::left::B%) #t2 in pairs) {
13+
self::left::A% a;
14+
{
15+
final dynamic #0#0 = #t2;
16+
if(!((let final dynamic #t3 = a = #0#0{(self::left::A%, self::left::B%)}.$1{self::left::A%} in true) && true))
17+
throw new _in::ReachabilityError::•();
18+
}
19+
#t1.{core::List::add}{Invariant}(a){(self::left::A%) → void};
20+
}
21+
} =>#t1;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
static method main() → void
6+
;
7+
static method left<A extends core::Object? = dynamic, B extends core::Object? = dynamic>(core::List<(self::left::A%, self::left::B%)> pairs) → core::List<self::left::A%>
8+
;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
import "dart:_internal" as _in;
5+
6+
static method main() → void {
7+
self::left<core::int, core::int>(core::_GrowableList::_literal2<(core::int, core::int)>((1, 2), (3, 4)));
8+
}
9+
static method left<A extends core::Object? = dynamic, B extends core::Object? = dynamic>(core::List<(self::left::A%, self::left::B%)> pairs) → core::List<self::left::A%>
10+
return block {
11+
final core::List<self::left::A%> #t1 = core::_GrowableList::•<self::left::A%>(0);
12+
{
13+
core::Iterator<(self::left::A%, self::left::B%)> :sync-for-iterator = pairs.{core::Iterable::iterator}{core::Iterator<(self::left::A%, self::left::B%)>};
14+
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
15+
final(self::left::A%, self::left::B%) #t2 = :sync-for-iterator.{core::Iterator::current}{(self::left::A%, self::left::B%)};
16+
{
17+
self::left::A% a;
18+
{
19+
final dynamic #0#0 = #t2;
20+
if(!((let final self::left::A% #t3 = a = #0#0{(self::left::A%, self::left::B%)}.$1{self::left::A%} in true) && true))
21+
throw new _in::ReachabilityError::•();
22+
}
23+
#t1.{core::List::add}{Invariant}(a){(self::left::A%) → void};
24+
}
25+
}
26+
}
27+
} =>#t1;
28+
29+
30+
Extra constant evaluation status:
31+
Evaluated: RecordLiteral @ org-dartlang-testcase:///for_in_without_variable.dart:6:9 -> RecordConstant(const (1, 2))
32+
Evaluated: RecordLiteral @ org-dartlang-testcase:///for_in_without_variable.dart:6:16 -> RecordConstant(const (3, 4))
33+
Extra constant evaluation: evaluated: 25, effectively constant: 2

pkg/front_end/testcases/textual_outline.status

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ records/block_combine_statements: FormatterCrash
186186
records/const_local_access: FormatterCrash
187187
records/const_record_literal: FormatterCrash
188188
records/duplicated_name_errors: FormatterCrash
189+
records/for_in_without_variable: FormatterCrash
189190
records/issue50132: FormatterCrash
190191
records/issue50133: FormatterCrash
191192
records/issue50157: FormatterCrash

0 commit comments

Comments
 (0)