mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 03:27:43 +00:00
912005267d
Change-Id: I46be49b2effec3e38a3dc44cd45cfe736f77fa78 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182680 Commit-Queue: Sigmund Cherem <sigmund@google.com> Reviewed-by: Joshua Litt <joshualitt@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Stephen Adams <sra@google.com>
43 lines
1.2 KiB
Dart
43 lines
1.2 KiB
Dart
// Copyright (c) 2012, 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";
|
|
|
|
main() {
|
|
var a = new A();
|
|
Expect.equals(42, a.foo(42));
|
|
var b = new B();
|
|
Expect.equals(42 - 87, b.foo(42));
|
|
|
|
// Make sure we do not try to track the parameter type of the
|
|
// argument passed to test.
|
|
Expect.equals("is !A", test(0));
|
|
Expect.equals("is !A", test("fisk"));
|
|
|
|
// Passing b to test should lead to an exception because the string
|
|
// we end up passing to B.foo does not implement the - operator.
|
|
Expect.throws(() => test(b), (e) => e is NoSuchMethodError);
|
|
}
|
|
|
|
// TODO(kasperl): Make sure this does not get inlined.
|
|
test(x) {
|
|
if (x is A) {
|
|
// The selector we use for this call site has the receiver type A
|
|
// because of data flow analysis. We have to make sure that we
|
|
// realize that this does not rule out calling B.foo because B
|
|
// implements A.
|
|
return x.foo("hest");
|
|
} else {
|
|
return "is !A";
|
|
}
|
|
}
|
|
|
|
class A {
|
|
foo(var x) => x;
|
|
}
|
|
|
|
class B implements A {
|
|
foo(var x) => x - 87;
|
|
}
|