Files
sdk/pkg/front_end/testcases/general/invalid_cast.dart
T
Johnni Winther dd1c3a3233 [vm] Make async transform resilient in context of invalid type and never type of iterables
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>
2021-03-03 11:58:08 +00:00

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() {}