// Copyright (c) 2021, 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.

import 'package:expect/expect.dart';

dynamic global;

class Foo<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
          T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
          T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
          T30, T31> {
  @pragma('vm:never-inline')
  Generic<T31> testForT31(dynamic arg) {
    global = '''$T0 $T1 $T2 $T3 $T4 $T5 $T6 $T7 $T8 $T9
            $T10 $T11 $T12 $T13 $T14 $T15 $T16 $T17 $T18 $T19
            $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 $T28 $T29
            $T30 $T31''';
    return arg as Generic<T31>;
  }

}

@pragma('vm:never-inline')
Generic<T31> foo<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9,
                 T10, T11, T12, T13, T14, T15, T16, T17, T18, T19,
                 T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
                 T30, T31>(dynamic arg) {
  global = '''$T0 $T1 $T2 $T3 $T4 $T5 $T6 $T7 $T8 $T9
          $T10 $T11 $T12 $T13 $T14 $T15 $T16 $T17 $T18 $T19
          $T20 $T21 $T22 $T23 $T24 $T25 $T26 $T27 $T28 $T29
          $T30 $T31''';
 return arg as Generic<T31>;
}

class Generic<T> {}

main() {
  final genericString = Generic<String>();
  Expect.isTrue(identical(Foo<bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
              bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
              bool, bool, bool, bool, bool, bool, bool, bool, bool, bool,
              bool, String>().testForT31(genericString), genericString));
  Expect.isTrue((global as String).endsWith('bool String'));

  Expect.isTrue(identical(
    foo<int, int, int, int, int, int, int, int, int, int,
              int, int, int, int, int, int, int, int, int, int,
              int, int, int, int, int, int, int, int, int, int,
              int, String>(genericString), genericString));
  Expect.isTrue((global as String).endsWith('int String'));
}
