mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 23:59:47 +00:00
6239c434fb
Elimination of redundant type cast 'x as Function' where x is a function type (such as 'void Function(int)') is not correct because it changes semantics of a function call if such expression is used as a receiver. "Function" static type of receiver allows arbitrary function calls, while known function type of the receiver means the call doesn't need to check parameter types. Static type of receiver is currently not stored in kernel AST but calculated from the receiver node, so replacing 'x as Function' with 'x' changes static type of the receiver from "Function" to function type. TEST=tests/language/regress/regress45428_test.dart Fixes https://github.com/dart-lang/sdk/issues/45428 Change-Id: If7148450526703daa63a442adf67a9e7a2dcea54 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/193524 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com>
23 lines
561 B
Dart
23 lines
561 B
Dart
// Copyright (c) 2021, 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.
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
void something(List<String> l) {
|
|
String s = l.first;
|
|
}
|
|
|
|
void checkAndInvoke(Function f) {
|
|
f(["foo"]);
|
|
var l = <int>[1];
|
|
Expect.throwsTypeError(() => f(l));
|
|
if (f is Function(List<Never>)) {
|
|
Expect.throwsTypeError(() => (f as Function)(l));
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
checkAndInvoke(something);
|
|
}
|