blob: 67083338f4c891786dd7e081d8cd240ef001c71e [file] [log] [blame]
// Copyright (c) 2018, 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
import "package:expect/expect.dart";
typedef F1 = void Function<T>(T);
typedef void F2<T>(T v);
dynamic defaultFLatest;
void defaultF<T>(T v) {
defaultFLatest = v;
}
class X1 {
final F1 f;
const X1({this.f: defaultF});
}
class X2 {
final F2 f;
const X2({this.f: defaultF});
}
class Y1 {
F1 f;
}
class Y2 {
F2 f;
}
dynamic foo() {
if (defaultFLatest == -1) return -1;
return "not -1";
}
void main() {
{
var x = const X1();
// OK with implicit dynamic type argument.
x.f("hello1");
Expect.equals("hello1", defaultFLatest);
// OK with explicit dynamic type argument.
x.f<dynamic>("hello2");
Expect.equals("hello2", defaultFLatest);
// OK with correctly given argument type.
x.f<String>("hello3");
Expect.equals("hello3", defaultFLatest);
// OK with correctly given argument type.
x.f<int>(42);
Expect.equals(42, defaultFLatest);
// Not OK with incorrectly given argument type.
x.f<int>("hello"); //# 01: compile-time error
// Not OK with incorrectly given argument type.
x.f<int>(foo()); //# 02: runtime error
var y = new Y1();
y.f = defaultF;
// OK with implicit dynamic type argument.
y.f("hello4");
Expect.equals("hello4", defaultFLatest);
// OK with explicit dynamic type argument.
y.f<dynamic>("hello5");
Expect.equals("hello5", defaultFLatest);
// OK with correctly given argument type.
y.f<String>("hello6");
Expect.equals("hello6", defaultFLatest);
// OK with correctly given argument type.
y.f<int>(43);
Expect.equals(43, defaultFLatest);
// Not OK with incorrectly given argument type.
y.f<int>("hello"); //# 03: compile-time error
// Not OK with incorrectly given argument type.
y.f<int>(foo()); //# 04: runtime error
}
{
var x = const X2();
// OK with no type arguments.
x.f("hello1");
Expect.equals("hello1", defaultFLatest);
// Not OK with a type argument.
x.f<dynamic>("hello2"); //# 05: compile-time error
// Not OK with a type argument.
x.f<String>("hello3"); //# 06: compile-time error
var y = new Y2();
y.f = defaultF;
// OK with no type argument.
y.f("hello4");
Expect.equals("hello4", defaultFLatest);
// Not OK with a type argument.
y.f<dynamic>("hello5"); //# 07: compile-time error
// Not OK with a type argument.
y.f<String>("hello6"); //# 08: compile-time error
// Correct runtime type of x.f.
void instantiatedFType(dynamic _) {}
Expect.equals(x.f.runtimeType.toString(),
instantiatedFType.runtimeType.toString()); // #09: ok
}
}