blob: 1e9e2aa73e36c86d18c89e02796497c24e7c91ac [file] [log] [blame]
// Copyright (c) 2022, 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.
class Class<T> {}
class ConcreteClass implements Class<ConcreteClass> {}
typedef F<X extends Class<X>> = X;
class G<X extends Class<X>> {}
test() {
<F, F<dynamic>>{}; // Ok
<F<Class>, F<Class<dynamic>>>{}; // Ok
<F<ConcreteClass>, F<Class<ConcreteClass>>>{}; // Ok
<F<Object>, F<int>>{}; // Error
<G, G<dynamic>>{}; // Ok
<G<Class>, G<Class<dynamic>>>{}; // Ok
<G<ConcreteClass>, G<Class<ConcreteClass>>>{}; // Ok
<G<Object>, G<int>>{}; // Error
<F>{}; // Ok
<F<dynamic>>{}; // Ok
<F<Class>>{}; // Ok
<F<Class<dynamic>>>{}; // Ok
<F<Object>>{}; // Error
<F<int>>{}; // Error
<F<ConcreteClass>>{}; // Ok
<F<Class<ConcreteClass>>>{}; // Ok
<G>{}; // Ok
<G<dynamic>>{}; // Ok
<G<Class>>{}; // Ok
<G<Class<dynamic>>>{}; // Ok
<G<ConcreteClass>>{}; // Ok
<G<Class<ConcreteClass>>>{}; // Ok
<G<Object>>{}; // Error
<G<int>>{}; // Error
<F>[]; // Ok
<F<dynamic>>[]; // Ok
<F<Class>>[]; // Ok
<F<Class<dynamic>>>[]; // Ok
<F<ConcreteClass>>[]; // Ok
<F<Class<ConcreteClass>>>[]; // Ok
<F<Object>>[]; // Error
<F<int>>[]; // Error
<G>[]; // Ok
<G<dynamic>>[]; // Ok
<G<Class>>[]; // Ok
<G<Class<dynamic>>>[]; // Ok
<G<ConcreteClass>>[]; // Ok
<G<Class<ConcreteClass>>>[]; // Ok
<G<Object>>[]; // Error
<G<int>>[]; // Error
}
main() {}