2018-10-12 00:52:25 +00:00
|
|
|
// 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.
|
|
|
|
|
2020-03-21 16:12:36 +00:00
|
|
|
// @dart = 2.7
|
|
|
|
|
2018-10-12 00:52:25 +00:00
|
|
|
// Test that type checks give consistent errors for the same types. In minified
|
|
|
|
// mode this checks that the minified class names are consistently tagged.
|
|
|
|
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
|
|
|
|
class Plain {}
|
|
|
|
|
|
|
|
class Foo<U> {}
|
|
|
|
|
|
|
|
class Test<T> {
|
|
|
|
@pragma('dart2js:noInline')
|
|
|
|
asT(o) => o as T;
|
|
|
|
|
|
|
|
@pragma('dart2js:noInline')
|
|
|
|
asFooT(o) => o as Foo<T>;
|
|
|
|
|
|
|
|
@pragma('dart2js:noInline')
|
|
|
|
testT(o) {
|
|
|
|
T result = o;
|
|
|
|
}
|
|
|
|
|
|
|
|
@pragma('dart2js:noInline')
|
|
|
|
testFooT(o) {
|
|
|
|
Foo<T> result = o;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
capture(action()) {
|
|
|
|
try {
|
|
|
|
action();
|
|
|
|
} catch (e) {
|
|
|
|
print('$e');
|
|
|
|
return '$e';
|
|
|
|
}
|
|
|
|
Expect.fail('Action should have failed');
|
|
|
|
}
|
|
|
|
|
|
|
|
dynamic g;
|
|
|
|
|
|
|
|
casts() {
|
|
|
|
g = Foo<String>();
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<Foo<Plain>>().asT(g)),
|
|
|
|
capture(() => g as Foo<Plain>),
|
|
|
|
"C1",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => g as Foo<Plain>),
|
|
|
|
capture(() => Test<Plain>().asFooT(g)),
|
|
|
|
"C2",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<Plain>().asT(g)),
|
|
|
|
capture(() => g as Plain),
|
|
|
|
"C3",
|
|
|
|
);
|
|
|
|
|
|
|
|
g = Foo<Plain>();
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<Foo<String>>().asT(g)),
|
|
|
|
capture(() => g as Foo<String>),
|
|
|
|
"C4",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => g as Foo<String>),
|
|
|
|
capture(() => Test<String>().asFooT(g)),
|
|
|
|
"C5",
|
|
|
|
);
|
|
|
|
|
|
|
|
g = Plain();
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<String>().asT(g)),
|
|
|
|
capture(() => g as String),
|
|
|
|
"C6",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<int>().asT(g)),
|
|
|
|
capture(() => g as int),
|
|
|
|
"C7",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<double>().asT(g)),
|
|
|
|
capture(() => g as double),
|
|
|
|
"C8",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<bool>().asT(g)),
|
|
|
|
capture(() => g as bool),
|
|
|
|
"C9",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<List>().asT(g)),
|
|
|
|
capture(() => g as List),
|
|
|
|
"C10",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
tests() {
|
|
|
|
g = Foo<String>();
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<Foo<Plain>>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
Foo<Plain> x = g;
|
|
|
|
}),
|
|
|
|
"T1",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() {
|
|
|
|
Foo<Plain> x = g;
|
|
|
|
}),
|
|
|
|
capture(() => Test<Plain>().testFooT(g)),
|
|
|
|
"T2",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<Plain>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
Plain x = g;
|
|
|
|
}),
|
|
|
|
"T3",
|
|
|
|
);
|
|
|
|
|
|
|
|
g = Foo<Plain>();
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<Foo<String>>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
Foo<String> x = g;
|
|
|
|
}),
|
|
|
|
"T4",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() {
|
|
|
|
Foo<String> x = g;
|
|
|
|
}),
|
|
|
|
capture(() => Test<String>().testFooT(g)),
|
|
|
|
"T5",
|
|
|
|
);
|
|
|
|
|
|
|
|
g = Plain();
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<String>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
String x = g;
|
|
|
|
}),
|
|
|
|
"T6",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<int>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
int x = g;
|
|
|
|
}),
|
|
|
|
"T7",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<double>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
double x = g;
|
|
|
|
}),
|
|
|
|
"T8",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<bool>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
bool x = g;
|
|
|
|
}),
|
|
|
|
"T9",
|
|
|
|
);
|
|
|
|
|
|
|
|
Expect.equals(
|
|
|
|
capture(() => Test<List>().testT(g)),
|
|
|
|
capture(() {
|
|
|
|
List x = g;
|
|
|
|
}),
|
|
|
|
"T10",
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
main() {
|
|
|
|
casts();
|
|
|
|
tests();
|
|
|
|
}
|