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

// Pre nonfunction-type-alias language version:
// @dart=2.12

T id<T>(T t) => t;

class Class<T> {
  final field1;
  final field5;
  final field6;
  final field7;
  final field8;
  final field9;
  final field10;
  final field11;
  final field15;

  const Class(o)
      // Potentially constant context:
      : field1 = T,
        field5 = <T>[],
        field6 = <T>{},
        field7 = <T, T>{},
        field8 = o is T,
        field9 = o is Class<T>,
        field10 = o as T,
        field11 = o as Class<T>,
        field15 = <Class<T>>[];

  void method() {
    const o = null;

    // Required constant context:
    const local1 = T;
    const local5 = <T>[];
    const local6 = <T>{};
    const local7 = <T, T>{};
    const local8 = o is T;
    const local9 = o is Class<T>;
    const local10 = o as T;
    const local11 = o as Class<T>;
    const local15 = <Class<T>>[];
    const List<T> listOfNever = []; // ok

    print(local1);
    print(local5);
    print(local6);
    print(local7);
    print(local8);
    print(local9);
    print(local10);
    print(local11);
    print(local15);
    print(listOfNever);

    // Inferred constant context:
    print(const [T]);
    print(const [<T>[]]);
    print(const [<T>{}]);
    print(const [<T, T>{}]);
    print(const [o is T]);
    print(const [o is Class<T>]);
    print(const [o as T]);
    print(const [o as Class<T>]);
    print(const [<Class<T>>[]]);
  }
}

main() {}
