dd1c3a3233
The CFE can invoke transformations despite having compile-time errors. The async transform was crashing the compiler if it hits for-in iterables that have an invalid type or never type. In case of an invalid type, the program has a compile-time error and won't be able to run propertly. So we'll replace the entire for-in with an invalid expression statement if the iterable is an invalid expression. In case of a never type, the program should compile fine, which this CL also fixes. This makes the newly added tests no longer result in DartkCrash but rather in a compile-time error (invalid expression) or runtime-error (never type). Closes https://github.com/dart-lang/sdk/issues/45014 Change-Id: Ic50f68400b67b57dd4a2c0a125b08f0f3e0d8dd6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/188463 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>
51 lines
1.3 KiB
Dart
51 lines
1.3 KiB
Dart
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// @dart=2.9
|
|
|
|
class C {
|
|
C();
|
|
factory C.fact() => null;
|
|
factory C.fact2() = D;
|
|
C.nonFact();
|
|
C.nonFact2() : this.nonFact();
|
|
static void staticFunction(int i) {}
|
|
}
|
|
|
|
class D extends C {}
|
|
|
|
void topLevelFunction(int i) {}
|
|
|
|
bad() {
|
|
void localFunction(int i) {}
|
|
List<int> a = <Object>[];
|
|
Map<int, String> b = <Object, String>{};
|
|
Map<int, String> c = <int, Object>{};
|
|
int Function(Object) d = (int i) => i;
|
|
D e = new C.fact();
|
|
D f = new C.fact2();
|
|
D g = new C.nonFact();
|
|
D h = new C.nonFact2();
|
|
void Function(Object) i = C.staticFunction;
|
|
void Function(Object) j = topLevelFunction;
|
|
void Function(Object) k = localFunction;
|
|
}
|
|
|
|
ok() {
|
|
void localFunction(int i) {}
|
|
List<int> a = <int>[];
|
|
Map<int, String> b = <int, String>{};
|
|
Map<int, String> c = <int, String>{};
|
|
int Function(int) d = (int i) => i;
|
|
D e = new C.fact();
|
|
D f = new C.fact2();
|
|
C g = new C.nonFact();
|
|
C h = new C.nonFact2();
|
|
void Function(int) i = C.staticFunction;
|
|
void Function(int) j = topLevelFunction;
|
|
void Function(int) k = localFunction;
|
|
}
|
|
|
|
main() {}
|