// 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.7

import 'package:compiler/src/util/testing.dart';

/*spec.class: Class1a:explicit=[Class1a*]*/
class Class1a {}

class Class1b extends Class1a {}

/*spec.class: Class2a:explicit=[Class2a<num*>*],needsArgs*/
class Class2a<T> {}

class Class2b<T> extends Class2a<T> {}

/*spec.member: method1:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
method1<T extends Class1a>() => null;

/*spec.member: method2:needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
method2<T extends Class2a<num>>() => null;

method3<T>() => null;

class Class3 {
  /*spec.member: Class3.method4:needsArgs,selectors=[Selector(call, method4, arity=0, types=1)]*/
  method4<T extends Class1a>() => null;

  /*spec.member: Class3.method5:needsArgs,selectors=[Selector(call, method5, arity=0, types=1)]*/
  method5<T extends Class2a<num>>() => null;

  method6<T>() => null;
}

/*spec.class: Class4:explicit=[Class4*]*/
class Class4 {}

/*spec.member: method10:needsArgs*/
method10<T extends Class4>() => null;

main() {
  /*spec.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
  /*prod.*/
  method7<T extends Class1a>() => null;

  /*spec.needsArgs,selectors=[Selector(call, call, arity=0, types=1)]*/
  /*prod.*/
  method8<T extends Class2a<num>>() => null;

  /**/ method9<T>() => null;

  dynamic f1 = method1;
  dynamic f2 = method2;
  dynamic f3 = method3;
  dynamic c3 = new Class3();
  dynamic f7 = method7;
  dynamic f8 = method8;
  dynamic f9 = method9;

  f1<Class1b>();
  f2<Class2b<int>>();
  f3<int>();
  c3.method4<Class1b>();
  c3.method5<Class2b<int>>();
  c3.method6<int>();
  f7<Class1b>();
  f8<Class2b<int>>();
  f9<int>();

  makeLive(/**/ () => f1<Class2a<num>>());
  makeLive(/**/ () => f2<Class2b<String>>());
  makeLive(/**/ () => c3.method4<Class2a<num>>());
  makeLive(
      /**/ () => c3.method5<Class2b<String>>());
  makeLive(/**/ () => f7<Class2a<num>>());
  makeLive(/**/ () => f8<Class2b<String>>());

  method10();
}
