/*
 * Copyright (c) 2020, 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 Note that free type variables which are explicitly used as type
 * arguments in const generic instances are still considered erroneous.
 *
 *   class G<T> {
 *    void foo() {
 *    const List<T> c = <T>[]; // Error
 *    const List<T> d = [];    // The list literal is inferred as <Never>[]
 *    }
 *   }
 *
 * @description Check that compile error is thrown when free type variable is
 * explicity used in the const generic instance.
 *
 * @author iarkh@unipro.ru
 */

class G1<T> {
  void foo() {
    const List<T> l1 = <T>[];
//                      ^
// [analyzer] unspecified
// [cfe] unspecified

    const List l2 = <T>[];
//                   ^
// [analyzer] unspecified
// [cfe] unspecified
  }
}

class G2<T extends int> {
  void foo() {
    const List<T> l1 = <T>[];
//                     ^
// [analyzer] unspecified
// [cfe] unspecified

    const List l2 = <T>[];
//                     ^
// [analyzer] unspecified
// [cfe] unspecified
  }
}

main() {
  G1().foo();
  G2().foo();
}
