blob: 3d8c9f9ca938e4220ad5af920391bdd6fcb0c444 [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
// Verify that when a super-bounded type is produced by instantiate-to-bounds,
// it's properly allowed or rejected depending on the context in which it's
// used.
// Raw `A` will be instantiated to `A<B<dynamic>>`, which is super-bounded.
class A<T extends B<T>> extends Base {
const A();
}
class B<T> {}
class Base {
const Base();
factory Base.test() = A; //# 01: compile-time error
}
typedef void OldStyleTypedef<T>();
typedef NewStyleTypedef<T> = void Function();
void genericFunction<T>() {}
mixin Mixin {}
class C {
dynamic field;
void genericMethod<T>() {}
A test; //# 02: ok
A test() {} //# 03: ok
void test(A param()) {} //# 04: ok
void test(A param) {} //# 05: ok
void test([A param]) {} //# 06: ok
void test({A param}) {} //# 07: ok
C(A param()); //# 08: ok
C(A this.field); //# 09: ok
C(A param); //# 10: ok
C([A param]); //# 11: ok
C({A param}); //# 12: ok
}
class Test extends B<A> {} //# 13: ok
class Test extends A {} //# 14: compile-time error
class Test implements A {} //# 15: compile-time error
class Test extends Object with A {} //# 16: compile-time error
class Test = A with Mixin; //# 17: compile-time error
class Test = Object with Mixin implements A; //# 18: compile-time error
class Test = Object with A; //# 19: compile-time error
mixin Test implements A {} //# 20: compile-time error
mixin Test on A {} //# 21: compile-time error
A test; //# 22: ok
A test() {} //# 23: ok
void test(A param()) {} //# 24: ok
void test(A param) {} //# 25: ok
void test([A param]) {} //# 26: ok
void test({A param}) {} //# 27: ok
typedef A Test(); //# 28: ok
typedef void Test(A param()); //# 29: ok
typedef void Test(A param); //# 30: ok
typedef void Test([A param]); //# 31: ok
typedef void Test({A param}); //# 32: ok
typedef Test = A Function(); //# 33: ok
typedef Test = void Function(A param); //# 34: ok
typedef Test = void Function(A); //# 35: ok
typedef Test = void Function([A param]); //# 36: ok
typedef Test = void Function([A]); //# 37: ok
typedef Test = void Function({A param}); //# 38: ok
void f(dynamic x) {
void localFunction<T>() {}
g(x as A); //# 39: ok
g(x is A); //# 40: ok
try {} on A catch (_) {} //# 41: ok
for (A test in [x]) {} //# 42: ok
A test; //# 43: ok
OldStyleTypedef<A> test; //# 44: ok
NewStyleTypedef<A> test; //# 45: ok
genericFunction<A>(); //# 46: ok
new C().genericMethod<A>(); //# 47: ok
localFunction<A>(); //# 48: ok
A test() {} //# 49: ok
void test(A param()) {} //# 50: ok
void test(A param) {} //# 51: ok
void test([A param]) {} //# 52: ok
void test({A param}) {} //# 53: ok
void Function(A param) test; //# 54: ok
void Function(A) test; //# 55: ok
void Function([A param]) test; //# 56: ok
void Function([A]) test; //# 57: ok
void Function({A param}) test; //# 58: ok
A(); //# 59: compile-time error
new A(); //# 60: compile-time error
const A(); //# 61: compile-time error
const test = A(); //# 62: compile-time error
}
void g(dynamic x) {}
main() {
f(null);
}