blob: 52d5b82292dcb7f838392182a1d549542b4bd14c [file] [log] [blame]
// Copyright (c) 2023, 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.
/// @assertion Assume that T1, .. Ts are types, and V resolves to an extension
/// type declaration of the following form:
///
/// extension type V<X1 extends B1, .. Xs extends Bs>(T id) ... {
/// ... // Members.
/// }
/// ...
/// When s is zero (that is, the declaration of V is not generic), V<T1, .. Ts>
/// simply stands for V, a non-generic extension type. When s is greater than
/// zero, a raw occurrence V is treated like a raw type: Instantiation to bound
/// is used to obtain the omitted type arguments.
///
/// @description Checks that it is a compile-time error to use super-bounded
/// extension type with wrong type arguments
/// @author sgrekhov22@gmail.com
class A<T extends A<T>> {}
extension type V<T extends A<T>>(int id) {
Type get type => T;
}
main() {
var v1 = V<void>(42);
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v2 = V<Object?>(42);
// ^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v3 = V<dynamic>(42);
// ^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v4 = V<Null>(42);
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v5 = V<A>(42);
// ^
// [analyzer] unspecified
// [cfe] unspecified
var v6 = V<A<Object?>>(42);
// ^^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v7 = V<A<void>>(42);
// ^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v8 = V<A<Null>>(42);
// ^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
var v9 = V<A<dynamic>>(42);
// ^^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}