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

// Test that identifiers in type parameter metadata can refer to other type
// parameters in the same declaration; they are in scope and take precedence
// over top level declarations, even if this leads to compile errors.

/// Top level declaration of T; nothing should resolve to this.
void T() {}

class Annotation {
  const Annotation(dynamic d);
}

class Class<T, @Annotation(T) U> {}
//                         ^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
// [cfe] Type variables can't be used in static members.

void function<T, @Annotation(T) U>() {}
//                           ^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
// [cfe] Type variables can't be used as constants.

extension Extension<T, @Annotation(T) U> on Map<T, U> {}
//                                 ^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
// [cfe] Type variables can't be used in static members.

class C {
  void method<T, @Annotation(T) U>() {}
  //                         ^
  // [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
  // [cfe] Type variables can't be used as constants.
}

mixin Mixin<T, @Annotation(T) U> {}
//                         ^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
// [cfe] Type variables can't be used in static members.

typedef void Typedef1<T, @Annotation(T) U>(T t, U u);
//                                   ^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
// [cfe] Type variables can't be used as constants.

typedef Typedef2<T, @Annotation(T) U> = void Function(T t, U u);
//                              ^
// [analyzer] COMPILE_TIME_ERROR.CONST_WITH_NON_CONSTANT_ARGUMENT
// [cfe] Type variables can't be used as constants.
