// Copyright (c) 2015, 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:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../../dart/resolution/context_collection_resolution.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(CheckerTest);
  });
}

@reflectiveTest
class CheckerTest extends PubPackageResolutionTest with WithoutNullSafetyMixin {
  // TODO(https://github.com/dart-lang/sdk/issues/44666): Use null safety in
  //  test cases.
  test_castsInConstantContexts() async {
    await assertErrorsInCode('''
class A {
  static const num n = 3.0;
  // The severe error is from constant evaluation where we know the
  // concrete type.
  static const int i = n;
  final int fi;
  const A(num a) : this.fi = a;
}
class B extends A {
  const B(Object a) : super(a);
}
void foo(Object o) {
  var a = const A(o);
}
''', [
      error(CompileTimeErrorCode.VARIABLE_TYPE_MISMATCH, 149, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 283, 1),
      error(CompileTimeErrorCode.CONST_WITH_NON_CONSTANT_ARGUMENT, 295, 1),
    ]);
  }

  test_compoundAssignment_returnsDynamic() async {
    await assertNoErrorsInCode(r'''
class Foo {
  operator +(other) => null;
}

main() {
  var foo = new Foo();
  foo = foo + 1;
  foo += 1;
}
''');
  }

  test_compoundAssignments() async {
    await assertErrorsInCode('''
class A {
  A operator *(B b) => null;
  A operator /(B b) => null;
  A operator ~/(B b) => null;
  A operator %(B b) => null;
  A operator +(B b) => null;
  A operator -(B b) => null;
  A operator <<(B b) => null;
  A operator >>(B b) => null;
  A operator &(B b) => null;
  A operator ^(B b) => null;
  A operator |(B b) => null;
  D operator [](B index) => null;
  void operator []=(B index, D value) => null;
}

class B {
  A operator -(B b) => null;
}

class D {
  D operator +(D d) => null;
}

class SubA extends A {}
class SubSubA extends SubA {}

foo() => new A();

test() {
  int x = 0;
  x += 5;
  x += 3.14;

  double y = 0.0;
  y += 5;
  y += 3.14;

  num z = 0;
  z += 5;
  z += 3.14;

  x = x + z;
  x += z;
  y = y + z;
  y += z;

  dynamic w = 42;
  x += w;
  y += w;
  z += w;

  A a = new A();
  B b = new B();
  var c = foo();
  a = a * b;
  a *= b;
  a *= c;
  a /= b;
  a ~/= b;
  a %= b;
  a += b;
  a += a;
  a -= b;
  b -= b;
  a <<= b;
  a >>= b;
  a &= b;
  a ^= b;
  a |= b;
  c += b;

  SubA sa;
  sa += b;
  SubSubA ssa = sa += b;

  var d = new D();
  a[b] += d;
  a[c] += d;
  a[z] += d;
  a[b] += c;
  a[b] += z;
  c[b] += d;
}
''', [
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 613, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 927, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 947, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 1045, 3),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 1110, 1),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 1142, 1),
    ]);
  }

  @FailingTest(issue: 'dartbug.com/33440')
  test_constantGenericTypeArg_explicit() async {
    // Regression test for https://github.com/dart-lang/sdk/issues/26141
    await assertNoErrorsInCode('''
abstract class Equality<R> {}
abstract class EqualityBase<R> implements Equality<R> {
  final C<R> c = const C<R>();
  const EqualityBase();
}
class DefaultEquality<S> extends EqualityBase<S> {
  const DefaultEquality();
}
class SetEquality<T> implements Equality<T> {
  final Equality<T> field = const DefaultEquality<T>();
  const SetEquality([Equality<T> inner = const DefaultEquality<T>()]);
}
class C<Q> {
  final List<Q> list = const <Q>[];
  final Map<Q, Iterable<Q>> m =  const <Q, Iterable<Q>>{};
  const C();
}
main() {
  const SetEquality<String>();
}
''');
  }

  test_constantGenericTypeArg_infer() async {
    // Regression test for https://github.com/dart-lang/sdk/issues/26141
    await assertNoErrorsInCode('''
abstract class Equality<Q> {}
abstract class EqualityBase<R> implements Equality<R> {
  final C<R> c = const C();
  const EqualityBase();
}
class DefaultEquality<S> extends EqualityBase<S> {
  const DefaultEquality();
}
class SetEquality<T> implements Equality<T> {
  final Equality<T> field = const DefaultEquality();
  const SetEquality([Equality<T> inner = const DefaultEquality()]);
}
class C<Q> {
  final List<Q> list = const [];
  final Map<Q, Iterable<Q>> m =  const {};
  const C();
}
main() {
  const SetEquality<String>();
}
''');
  }

  test_constructors() async {
    await assertErrorsInCode('''
const num z = 25;
Object obj = "world";

class A {
  int x;
  String y;

  A(this.x) : this.y = 42;

  A.c1(p): this.x = z, this.y = p;

  A.c2(this.x, this.y);

  A.c3(num this.x, String this.y);
}

class B extends A {
  B() : super("hello");

  B.c2(int x, String y) : super.c2(y, x);

  B.c3(num x, Object y) : super.c3(x, y);
}

void main() {
   A a = new A.c2(z, z);
   var b = new B.c2("hello", obj);
}
''', [
      error(CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 96, 2),
      error(CompileTimeErrorCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, 169,
          10),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 234, 7),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 280, 1),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 283, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 352, 1),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 368, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 379, 1),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 392, 7),
    ]);
  }

  test_conversionAndDynamicInvoke() async {
    newFile('$testPackageLibPath/helper.dart', content: r'''
dynamic toString = (int x) => x + 42;
dynamic hashCode = "hello";
''');

    await assertErrorsInCode('''
import 'helper.dart' as helper;

class A {
  String x = "hello world";

  void baz1(y) { x + y; }
  static baz2(y) => y + y;
}

void foo(String str) {
  print(str);
}

class B {
  String toString([int arg]) => arg.toString();
}

void bar(a) {
  foo(a.x);
}

baz() => new B();

typedef DynFun(x);
typedef StrFun(String x);

var bar1 = bar;

void main() {
  var a = new A();
  bar(a);
  (bar1(a));
  var b = bar;
  (b(a));
  var f1 = foo;
  f1("hello");
  dynamic f2 = foo;
  (f2("hello"));
  DynFun f3 = foo;
  (f3("hello"));
  (f3(42));
  StrFun f4 = foo;
  f4("hello");
  a.baz1("hello");
  var b1 = a.baz1;
  (b1("hello"));
  A.baz2("hello");
  var b2 = A.baz2;
  (b2("hello"));

  dynamic a1 = new B();
  (a1.x);
  a1.toString();
  (a1.toString(42));
  var toStringClosure = a1.toString;
  (a1.toStringClosure());
  (a1.toStringClosure(42));
  (a1.toStringClosure("hello"));
  a1.hashCode;

  dynamic toString = () => null;
  (toString());

  (helper.toString());
  var toStringClosure2 = helper.toString;
  (toStringClosure2());
  int hashCode = helper.hashCode;

  baz().toString();
  baz().hashCode;
}
''', [
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 503, 3),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 760, 15),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 1039, 8),
    ]);
  }

  test_covariantOverride_leastUpperBound() async {
    await assertNoErrorsInCode(r'''
abstract class Top {}
abstract class Left implements Top {}
abstract class Right implements Top {}
abstract class Bottom implements Left, Right {}

abstract class TakesLeft {
  void m(Left x);
}
abstract class TakesRight {
  void m(Right x);
}
abstract class TakesTop implements TakesLeft, TakesRight {
  void m(Top x); // works today
}
abstract class TakesBottom implements TakesLeft, TakesRight {
  // LUB(Left, Right) == Top, so this is an implicit cast from Top to Bottom.
  void m(covariant Bottom x);
}
''');
  }

  test_covariantOverride_markerIsInherited() async {
    await assertErrorsInCode(r'''
class C {
  num f(covariant num x) => x;
}
class D extends C {
  int f(int x) => x;
}
class E extends D {
  int f(Object x) => x;
}
class F extends E {
  int f(int x) => x;
}
class G extends E implements D {}

class D_error extends C {
  int f(String x) => 0;
}
class E_error extends D {
  int f(double x) => 0;
}
class F_error extends E {
  int f(double x) => 0;
}
class G_error extends E implements D {
  int f(double x) => 0;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 242, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 294, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 346, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 411, 1),
    ]);
  }

  test_dynamicInvocation() {
    return assertErrorsInCode(r'''
typedef dynamic A(dynamic x);
class B {
  int call(int x) => x;
  bool col(bool x) => x;
}
void main() {
  {
    B f = new B();
    int x;
    bool y;
    x = f(3);
    x = f.col(true);
    y = f(3);
    y = f.col(true);
    f(true);
    f.col(3);
  }
  {
    Function f = new B();
    int x;
    bool y;
    x = f(3);
    x = f.col(true);
    y = f(3);
    y = f.col(true);
    f(true);
    // Through type propagation, we know f is actually a B, hence the
    // hint.
    f.col(3);
  }
  {
    A f = new B();
    B b = new B();
    f = b;
    int x;
    bool y;
    x = f(3);
    y = f(3);
    f(true);
  }
  {
    dynamic g = new B();
    g.call(true);
    g.col(true);
    g.foo(true);
    g.x;
    A f = new B();
    B b = new B();
    f = b;
    f.col(true);
    f.foo(true);
    f.x;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 136, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 148, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 173, 11),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 194, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 227, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 244, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 290, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 302, 1),
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 329, 3),
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 364, 3),
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 477, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 503, 7),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 539, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 550, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 562, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 710, 7),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 746, 1),
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 755, 3),
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 772, 3),
      error(CompileTimeErrorCode.UNDEFINED_GETTER, 789, 1),
    ]);
  }

  test_functionTypingAndSubtyping_classes() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef A Top(B x);   // Top of the lattice
typedef B Left(B x);  // Left branch
typedef B Left2(B x); // Left branch
typedef A Right(A x); // Right branch
typedef B Bot(A x);   // Bottom of the lattice

B left(B x) => x;
B bot_(A x) => x;
B bot(A x) => x as B;
A top(B x) => x;
A right(A x) => x;

void main() {
  { // Check typedef equality
    Left f = left;
    Left2 g = f;
  }
  {
    Top f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Left f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Right f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Bot f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 405, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 428, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 503, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 514, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 541, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 579, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 590, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 603, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 653, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 664, 3),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 677, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 691, 5),
    ]);
  }

  test_functionTypingAndSubtyping_dynamic() async {
    await assertErrorsInCode('''
class A {}

typedef dynamic Top(Null x);     // Top of the lattice
typedef dynamic Left(A x);          // Left branch
typedef A Right(Null x);         // Right branch
typedef A Bottom(A x);              // Bottom of the lattice

void main() {
  Top top;
  Left left;
  Right right;
  Bottom bot;
  {
    Top f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Left f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Right f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Bottom f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 308, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 383, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 421, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 459, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 483, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 536, 1),
    ]);
  }

  test_functionTypingAndSubtyping_dynamic_knownFunctions() async {
    // Our lattice should look like this:
    //
    //
    //           Bot -> Top
    //          /        \
    //      A -> Top    Bot -> A
    //       /     \      /
    // Top -> Top   A -> A
    //         \      /
    //         Top -> A
    //
    // Note that downcasts of known functions are promoted to
    // static type errors, since they cannot succeed.
    // This makes some of what look like downcasts turn into
    // type errors below.
    await assertErrorsInCode('''
class A {}

typedef dynamic BotTop(Null x);
typedef dynamic ATop(A x);
typedef A BotA(Null x);
typedef A AA(A x);
typedef A TopA(Object x);
typedef dynamic TopTop(Object x);

dynamic aTop(A x) => x;
A aa(A x) => x;
dynamic topTop(dynamic x) => x;
A topA(dynamic x) => x;
void apply<T>(T f0, T f1, T f2,
                  T f3, T f4, T f5) {}
void main() {
  BotTop botTop;
  BotA botA;
  {
    BotTop f;
    f = topA;
    f = topTop;
    f = aa;
    f = aTop;
    f = botA;
    f = botTop;
    apply<BotTop>(
        topA,
        topTop,
        aa,
        aTop,
        botA,
        botTop
                      );
    apply<BotTop>(
        (dynamic x) => new A(),
        (dynamic x) => (x as Object),
        (A x) => x,
        (A x) => null,
        botA,
        botTop
                      );
  }
  {
    ATop f;
    f = topA;
    f = topTop;
    f = aa;
    f = aTop;
    f = botA;
    f = botTop;
    apply<ATop>(
        topA,
        topTop,
        aa,
        aTop,
        botA,
        botTop
    );
    apply<ATop>(
        (dynamic x) => new A(),
        (dynamic x) => (x as Object),
        (A x) => x,
        (A x) => null,
        botA,
        botTop
    );
  }
  {
    BotA f;
    f = topA;
    f = topTop;
    f = aa;
    f = aTop;
    f = botA;
    f = botTop;
    apply<BotA>(
        topA,
        topTop,
        aa,
        aTop,
        botA,
        botTop
    );
    apply<BotA>(
        (dynamic x) => new A(),
        (dynamic x) => (x as Object),
        (A x) => x,
        (A x) => (x as Object),
        botA,
        botTop
    );
  }
  {
    AA f;
    f = topA;
    f = topTop;
    f = aa;
    f = aTop; // known function
    f = botA;
    f = botTop;
    apply<AA>(
        topA,
        topTop,
        aa,
        aTop, // known function
        botA,
        botTop
                  );
    apply<AA>(
        (dynamic x) => new A(),
        (dynamic x) => (x as Object),
        (A x) => x,
        (A x) => (x as Object), // known function
        botA,
        botTop
    );
  }
  {
    TopTop f;
    f = topA;
    f = topTop;
    f = aa;
    f = aTop; // known function
    f = botA;
    f = botTop;
    apply<TopTop>(
        topA,
        topTop,
        aa,
        aTop, // known function
        botA,
        botTop
    );
    apply<TopTop>(
        (dynamic x) => new A(),
        (dynamic x) => (x as Object),
        (A x) => x,
        (A x) => (x as Object), // known function
        botA,
        botTop
    );
  }
  {
    TopA f;
    f = topA;
    f = topTop; // known function
    f = aa; // known function
    f = aTop; // known function
    f = botA;
    f = botTop;
    apply<TopA>(
        topA,
        topTop, // known function
        aa, // known function
        aTop, // known function
        botA,
        botTop
    );
    apply<TopA>(
        (dynamic x) => new A(),
        (dynamic x) => (x as Object), // known function
        (A x) => x, // known function
        (A x) => (x as Object), // known function
        botA,
        botTop
    );
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 401, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 822, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 889, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 992, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 1158, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 1203, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1228, 6),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1256, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 1331, 6),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 1359, 4),
      error(HintCode.UNNECESSARY_CAST, 1526, 11),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 1591, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1616, 6),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 1644, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 1735, 6),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 1763, 4),
      error(HintCode.UNNECESSARY_CAST, 1960, 11),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 2047, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 2088, 2),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2100, 4),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 2132, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 2211, 2),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2223, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 2255, 4),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 2380, 10),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION_EXPR, 2400, 22),
      error(HintCode.UNNECESSARY_CAST, 2410, 11),
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 2450, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 2495, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2520, 6),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2554, 2),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2584, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2677, 6),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2711, 2),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 2741, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION_EXPR, 2914, 10),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION_EXPR, 2952, 22),
      error(HintCode.UNNECESSARY_CAST, 2962, 11),
    ]);
  }

  test_functionTypingAndSubtyping_functionLiteralVariance() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);

A top(B x) => x;
B left(B x) => x;
A right(A x) => x;
B bot(A x) => x as B;

void main() {
  {
    Function2<B, A> f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<B, B> f; // left
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<A, A> f; // right
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<A, B> f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 181, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 267, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 286, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 313, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 361, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 381, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 394, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 456, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 467, 3),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 480, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 494, 5),
    ]);
  }

  test_functionTypingAndSubtyping_functionVariableVariance() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);

void main() {
  {
    Function2<B, A> top;
    Function2<B, B> left;
    Function2<A, A> right;
    Function2<A, B> bot;

    top = right;
    top = bot;
    top = top;
    top = left;

    left = top;
    left = left;
    left = right;
    left = bot;

    right = top;
    right = left;
    right = right;
    right = bot;

    bot = top;
    bot = left;
    bot = right;
    bot = bot;
  }
}
''', [
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 296, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 349, 4),
    ]);
  }

  test_functionTypingAndSubtyping_higherOrderFunctionLiteral1() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);

typedef A BToA(B x);  // Top of the base lattice
typedef B AToB(A x);  // Bot of the base lattice

BToA top(AToB f) => f;
AToB left(AToB f) => f;
BToA right(BToA f) => f;
AToB bot_(BToA f) => f;
AToB bot(BToA f) => f as AToB;

void main() {
  {
    Function2<AToB, BToA> f; // Top
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<AToB, AToB> f; // Left
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<BToA, BToA> f; // Right
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<BToA, AToB> f; // Bot
    f = bot;
    f = left;
    f = top;
    f = right;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 337, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 436, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 455, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 482, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 536, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 556, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 569, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 637, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 668, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 682, 3),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 695, 5),
    ]);
  }

  test_functionTypingAndSubtyping_higherOrderFunctionLiteral2() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);

typedef A BToA(B x);  // Top of the base lattice
typedef B AToB(A x);  // Bot of the base lattice

Function2<B, A> top(AToB f) => f;
Function2<A, B> left(AToB f) => f;
Function2<B, A> right(BToA f) => f;
Function2<A, B> bot_(BToA f) => f;
Function2<A, B> bot(BToA f) => f as Function2<A, B>;

void main() {
  {
    Function2<AToB, BToA> f; // Top
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<AToB, AToB> f; // Left
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<BToA, BToA> f; // Right
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<BToA, AToB> f; // Bot
    f = bot;
    f = left;
    f = top;
    f = right;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 403, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 502, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 521, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 548, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 602, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 622, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 635, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 703, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 734, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 748, 3),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 761, 5),
    ]);
  }

  test_functionTypingAndSubtyping_higherOrderFunctionLiteral3() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);

typedef A BToA(B x);  // Top of the base lattice
typedef B AToB(A x);  // Bot of the base lattice

BToA top(Function2<A, B> f) => f;
AToB left(Function2<A, B> f) => f;
BToA right(Function2<B, A> f) => f;
AToB bot_(Function2<B, A> f) => f;
AToB bot(Function2<B, A> f) => f as AToB;

void main() {
  {
    Function2<AToB, BToA> f; // Top
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<AToB, AToB> f; // Left
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<BToA, BToA> f; // Right
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Function2<BToA, AToB> f; // Bot
    f = bot;
    f = left;
    f = top;
    f = right;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 392, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 491, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 510, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 537, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 591, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 611, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 624, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 692, 1),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 723, 4),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 737, 3),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 750, 5),
    ]);
  }

  test_functionTypingAndSubtyping_higherOrderFunctionVariables() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);

void main() {
  {
    Function2<Function2<A, B>, Function2<B, A>> top;
    Function2<Function2<B, A>, Function2<B, A>> right;
    Function2<Function2<A, B>, Function2<A, B>> left;
    Function2<Function2<B, A>, Function2<A, B>> bot;

    top = right;
    top = bot;
    top = top;
    top = left;

    left = top;
    left = left;
    left = right;
    left = bot;

    right = top;
    right = left;
    right = right;
    right = bot;

    bot = top;
    bot = left;
    bot = right;
    bot = bot;
  }
}
''', [
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 408, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 461, 4),
    ]);
  }

  test_functionTypingAndSubtyping_instanceMethodVariance() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

class C {
  A top(B x) => x;
  B left(B x) => x;
  A right(A x) => x;
  B bot(A x) => x as B;
}

typedef T Function2<S, T>(S z);

void main() {
  C c = new C();
  {
    Function2<B, A> f;
    f = c.top;
    f = c.left;
    f = c.right;
    f = c.bot;
  }
  {
    Function2<B, B> f;
    f = c.top;
    f = c.left;
    f = c.right;
    f = c.bot;
  }
  {
    Function2<A, A> f;
    f = c.top;
    f = c.left;
    f = c.right;
    f = c.bot;
  }
  {
    Function2<A, B> f;
    f = c.top;
    f = c.left;
    f = c.right;
    f = c.bot;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 218, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 312, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 354, 7),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 406, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 432, 6),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 500, 1),
    ]);
  }

  test_functionTypingAndSubtyping_intAndObject() async {
    await assertErrorsInCode('''
typedef Object Top(int x);      // Top of the lattice
typedef int Left(int x);        // Left branch
typedef int Left2(int x);       // Left branch
typedef Object Right(Object x); // Right branch
typedef int Bot(Object x);      // Bottom of the lattice

Object globalTop(int x) => x;
int globalLeft(int x) => x;
Object globalRight(Object x) => x;
int bot_(Object x) => x;
int globalBot(Object x) => x as int;

void main() {
  // Note: use locals so we only know the type, not that it's a specific
  // function declaration. (we can issue better errors in that case.)
  var top = globalTop;
  var left = globalLeft;
  var right = globalRight;
  var bot = globalBot;

  { // Check typedef equality
    Left f = left;
    Left2 g = f;
  }
  {
    Top f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Left f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Right f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
  {
    Bot f;
    f = top;
    f = left;
    f = right;
    f = bot;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 725, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 748, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 823, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 861, 5),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 899, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 923, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 973, 1),
    ]);
  }

  test_functionTypingAndSubtyping_namedAndOptionalParameters() async {
    await assertErrorsInCode('''
class A {}

typedef A FR(A x);
typedef A FO([A x]);
typedef A FN({A x});
typedef A FRR(A x, A y);
typedef A FRO(A x, [A y]);
typedef A FRN(A x, {A n});
typedef A FOO([A x, A y]);
typedef A FNN({A x, A y});
typedef A FNNN({A z, A y, A x});

void main() {
   FR r;
   FO o;
   FN n;
   FRR rr;
   FRO ro;
   FRN rn;
   FOO oo;
   FNN nn;
   FNNN nnn;

   r = r;
   r = o;
   r = n;
   r = rr;
   r = ro;
   r = rn;
   r = oo;
   r = nn;
   r = nnn;

   o = r;
   o = o;
   o = n;
   o = rr;
   o = ro;
   o = rn;
   o = oo;
   o = nn;
   o = nnn;

   n = r;
   n = o;
   n = n;
   n = rr;
   n = ro;
   n = rn;
   n = oo;
   n = nn;
   n = nnn;

   rr = r;
   rr = o;
   rr = n;
   rr = rr;
   rr = ro;
   rr = rn;
   rr = oo;
   rr = nn;
   rr = nnn;

   ro = r;
   ro = o;
   ro = n;
   ro = rr;
   ro = ro;
   ro = rn;
   ro = oo;
   ro = nn;
   ro = nnn;

   rn = r;
   rn = o;
   rn = n;
   rn = rr;
   rn = ro;
   rn = rn;
   rn = oo;
   rn = nn;
   rn = nnn;

   oo = r;
   oo = o;
   oo = n;
   oo = rr;
   oo = ro;
   oo = rn;
   oo = oo;
   oo = nn;
   oo = nnn;

   nn = r;
   nn = o;
   nn = n;
   nn = rr;
   nn = ro;
   nn = rn;
   nn = oo;
   nn = nn;
   nn = nnn;

   nnn = r;
   nnn = o;
   nnn = n;
   nnn = rr;
   nnn = ro;
   nnn = rn;
   nnn = oo;
   nnn = nn;
   nnn = nnn;
}
''', [
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 377, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 387, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 431, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 442, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 475, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 485, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 496, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 507, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 529, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 540, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 553, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 563, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 583, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 594, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 605, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 616, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 652, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 663, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 674, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 709, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 733, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 745, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 770, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 781, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 816, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 840, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 852, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 877, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 888, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 899, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 911, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 935, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 947, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 959, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 995, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1030, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1054, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1066, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1080, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1091, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1113, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1125, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1137, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1149, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1188, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1200, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1224, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1237, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1250, 2),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1263, 2),
    ]);
  }

  test_functionTypingAndSubtyping_objectsWithCallMethods() async {
    await assertErrorsInCode('''
typedef int I2I(int x);
typedef num N2N(num x);
class A {
   int call(int x) => x;
}
class B {
   num call(num x) => x;
}
int i2i(int x) => x;
num n2n(num x) => x;
void main() {
   {
     I2I f;
     f = new A();
     f = new B();
     f = i2i;
     f = n2n;
     f = i2i as Object;
     f = n2n as Function;
   }
   {
     N2N f;
     f = new A();
     f = new B();
     f = i2i;
     f = n2n;
     f = i2i as Object;
     f = n2n as Function;
   }
   {
     A f;
     f = new A();
     f = new B();
     f = i2i;
     f = n2n;
     f = i2i as Object;
     f = n2n as Function;
   }
   {
     B f;
     f = new A();
     f = new B();
     f = i2i;
     f = n2n;
     f = i2i as Object;
     f = n2n as Function;
   }
   {
     Function f;
     f = new A();
     f = new B();
     f = i2i;
     f = n2n;
     f = i2i as Object;
     f = n2n as Function;
   }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 192, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 222, 7),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 254, 3),
      error(HintCode.UNNECESSARY_CAST, 268, 13),
      error(HintCode.UNNECESSARY_CAST, 292, 15),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 328, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 340, 7),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 376, 3),
      error(HintCode.UNNECESSARY_CAST, 404, 13),
      error(HintCode.UNNECESSARY_CAST, 428, 15),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 462, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 492, 7),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 510, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 524, 3),
      error(HintCode.UNNECESSARY_CAST, 538, 13),
      error(HintCode.UNNECESSARY_CAST, 562, 15),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 562, 15),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 596, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 608, 7),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 644, 3),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 658, 3),
      error(HintCode.UNNECESSARY_CAST, 672, 13),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 696, 15),
      error(HintCode.UNNECESSARY_CAST, 696, 15),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 737, 1),
      error(HintCode.UNNECESSARY_CAST, 813, 13),
      error(HintCode.UNNECESSARY_CAST, 837, 15),
    ]);
  }

  test_functionTypingAndSubtyping_staticMethodVariance() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

class C {
  static A top(B x) => x;
  static B left(B x) => x;
  static A right(A x) => x;
  static B bot(A x) => x as B;
}

typedef T Function2<S, T>(S z);

void main() {
  {
    Function2<B, A> f;
    f = C.top;
    f = C.left;
    f = C.right;
    f = C.bot;
  }
  {
    Function2<B, B> f;
    f = C.top;
    f = C.left;
    f = C.right;
    f = C.bot;
  }
  {
    Function2<A, A> f;
    f = C.top;
    f = C.left;
    f = C.right;
    f = C.bot;
  }
  {
    Function2<A, B> f;
    f = C.top;
    f = C.left;
    f = C.right;
    f = C.bot;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 229, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 323, 1),
      error(CompileTimeErrorCode.INVALID_CAST_METHOD, 334, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 365, 7),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 417, 1),
      error(CompileTimeErrorCode.INVALID_CAST_METHOD, 428, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 443, 6),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 511, 1),
      error(CompileTimeErrorCode.INVALID_CAST_METHOD, 522, 5),
      error(CompileTimeErrorCode.INVALID_CAST_METHOD, 537, 6),
      error(CompileTimeErrorCode.INVALID_CAST_METHOD, 553, 7),
    ]);
  }

  test_functionTypingAndSubtyping_subtypeOfUniversalType() async {
    await assertErrorsInCode('''
void main() {
  nonGenericFn(x) => null;
  {
    R f<P, R>(P p) => null;
    T g<S, T>(S s) => null;

    var local = f;
    local = g; // valid

    // Non-generic function cannot subtype a generic one.
    local = (x) => null;
    local = nonGenericFn;
  }
  {
    Iterable<R> f<P, R>(List<P> p) => null;
    List<T> g<S, T>(Iterable<S> s) => null;

    var local = f;
    local = g; // valid

    var local2 = g;
    local = local2;
    local2 = f;
    local2 = local;

    // Non-generic function cannot subtype a generic one.
    local = (x) => null;
    local = nonGenericFn;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 110, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 216, 11),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 241, 12),
      error(CompileTimeErrorCode.INVALID_CAST_FUNCTION, 449, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 543, 11),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 568, 12),
    ]);
  }

  test_genericClassMethodOverride() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

class Base<T extends B> {
  T foo() => null;
}

class Derived<S extends A> extends Base<B> {
  S foo() => null;
}

class Derived2<S extends B> extends Base<B> {
  S foo() => null;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 130, 3),
    ]);
  }

  test_genericMethodOverride() async {
    await assertNoErrorsInCode('''
class Future<T> {
  S then<S>(S onValue(T t)) => null;
}

class DerivedFuture<T> extends Future<T> {
  S then<S>(S onValue(T t)) => null;
}

class DerivedFuture2<A> extends Future<A> {
  B then<B>(B onValue(A a)) => null;
}

class DerivedFuture3<T> extends Future<T> {
  S then<S>(Object onValue(T t)) => null;
}

class DerivedFuture4<A> extends Future<A> {
  B then<B>(Object onValue(A a)) => null;
}
''');
  }

  test_genericMethodSuper() async {
    await assertErrorsInCode(r'''
class A<T> {
  A<S> create<S extends T>() => new A<S>();
}
class B extends A {
  A<S> create<S>() => super.create<S>();
}
class C extends A {
  A<S> create<S>() => super.create();
}
class D extends A<num> {
  A<S> create<S extends num>() => super.create<S>();
}
class E extends A<num> {
  A<S> create<S extends num>() => super.create<int>();
}
class F extends A<num> {
  create2<S>() => super.create</*error:TYPE_ARGUMENT_NOT_MATCHING_BOUNDS*/S>();
}
''', [
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 321, 19),
      error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 443, 1),
    ]);
  }

  test_genericMethodSuperSubstitute() async {
    await assertNoErrorsInCode(r'''
class Cloneable<T> {}
class G<T> {
  create<A extends Cloneable<T>, B extends Iterable<A>>() => null;
}
class H extends G<num> {
  create2() => super.create<Cloneable<int>, List<Cloneable<int>>>();
}
''');
  }

  test_getterGetterOverride() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}
class C extends B {}

abstract class Base {
  B get f1;
  B get f2;
  B get f3;
  B get f4;
}

class Child extends Base {
  A get f1 => null;
  C get f2 => null;
  get f3 => null;
  dynamic get f4 => null;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 162, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 226, 2),
    ]);
  }

  test_getterOverride() async {
    await assertErrorsInCode('''
typedef void ToVoid<T>(T x);

class F {
  ToVoid<dynamic> get f => null;
  ToVoid<int> get g => null;
}

class G extends F {
  ToVoid<int> get f => null;
  ToVoid<dynamic> get g => null;
}

class H implements F {
  ToVoid<int> get f => null;
  ToVoid<dynamic> get g => null;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 143, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 231, 1),
    ]);
  }

  test_ifForDoWhileStatementsUseBooleanConversion() async {
    await assertErrorsInCode('''
main() {
  dynamic dyn = 42;
  Object obj = 42;
  int i = 42;
  bool b = false;

  if (b) {}
  if (dyn) {}
  if (obj) {}
  if (i) {}

  while (b) {}
  while (dyn) {}
  while (obj) {}
  while (i) {}

  do {} while (b);
  do {} while (dyn);
  do {} while (obj);
  do {} while (i);

  for (;b;) {}
  for (;dyn;) {}
  for (;obj;) {}
  for (;i;) {}
}
''', [
      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 127, 1),
      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 192, 1),
      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 275, 1),
      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 337, 1),
    ]);
  }

  test_implicitDynamic_field() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
class C {
  var x0;
  var x1 = (<dynamic>[])[0];
  var x2, x3 = 42, x4;
  dynamic y0;
  dynamic y1 = (<dynamic>[])[0];
}
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 16, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 26, 21),
      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 55, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 68, 2),
    ]);
  }

  test_implicitDynamic_function() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
T a<T>(T t) => t;
T b<T>() => null;

void main<S>() {
  dynamic d;
  int i;
  a(d);
  a(42);
  b();
  d = b();
  i = b();

  void f<T>(T t) {};
  T g<T>() => null;

  f(d);
  f(42);
  g();
  d = g();
  i = g();

  (<T>(T t) => t)(d);
  (<T>(T t) => t)(42);
  (<T>() => null as T)<int>();
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 73, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 78, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 95, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 106, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 167, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 184, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FUNCTION, 195, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_INVOKE, 214, 15),
      error(HintCode.UNNECESSARY_CAST, 269, 9),
    ]);
  }

  test_implicitDynamic_listLiteral() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
var l0 = [];
List l1 = [];
List<dynamic> l2 = [];
dynamic d = 42;
var l3 = [d, d];

var l4 = <dynamic>[];
var l5 = <int>[];
List<int> l6 = [];
var l7 = [42];
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 9, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 23, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 46, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_LIST_LITERAL, 75, 6),
    ]);
  }

  test_implicitDynamic_mapLiteral() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
var m0 = {};
Map m1 = {};
Map<dynamic, dynamic> m2 = {};
dynamic d = 42;
var m3 = {d: d};
var m4 = {'x': d, 'y': d};
var m5 = {d: 'x'};

var m6 = <dynamic, dynamic>{};
var m7 = <String, String>{};
Map<String, String> m8 = {};
var m9 = {'hi': 'there'};
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 9, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 22, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 53, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 82, 6),
      error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 99, 16),
      error(LanguageCode.IMPLICIT_DYNAMIC_MAP_LITERAL, 126, 8),
    ]);
  }

  test_implicitDynamic_method() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
class C {
  T m<T>(T s) => s;
  T n<T>() => null;
}
class D<E> {
  T m<T>(T s) => s;
  T n<T>() => null;
}
void f() {
  dynamic d;
  int i;
  new C().m(d);
  new C().m(42);
  new C().n();
  d = new C().n();
  i = new C().n();

  new D<int>().m(d);
  new D<int>().m(42);
  new D<int>().n();
  d = new D<int>().n();
  i = new D<int>().n();
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 137, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_METHOD, 150, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_METHOD, 183, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_METHOD, 202, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_METHOD, 242, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_METHOD, 285, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_METHOD, 309, 1),
    ]);
  }

  test_implicitDynamic_parameter() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
const dynamic DYNAMIC_VALUE = 42;

// simple formal
void f0(x) {}
void f1(dynamic x) {}

// default formal
void df0([x = DYNAMIC_VALUE]) {}
void df1([dynamic x = DYNAMIC_VALUE]) {}

// https://github.com/dart-lang/sdk/issues/25794
void df2([x = 42]) {}

// default formal (named)
void nf0({x: DYNAMIC_VALUE}) {}
void nf1({dynamic x: DYNAMIC_VALUE}) {}

// https://github.com/dart-lang/sdk/issues/25794
void nf2({x: 42}) {}

// field formal
class C {
  var x;
  C(this.x);
}

// function typed formal
void ftf0(void x(y)) {}
void ftf1(void x(int y)) {}
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_PARAMETER, 60, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_PARAMETER, 117, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_PARAMETER, 241, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_PARAMETER, 290, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_PARAMETER, 412, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_FIELD, 456, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_PARAMETER, 517, 1),
    ]);
  }

  test_implicitDynamic_return() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
// function
f0() {return f0();}
dynamic f1() { return 42; }

// nested function
void main() {
  g0() {return g0();}
  dynamic g1() { return 42; }
}

// methods
class B {
  int m1() => 42;
}
class C extends B {
  m0() => 123;
  m1() => 123;
  dynamic m2() => 'hi';
}

// accessors
set x(int value) {}
get y0 => 42;
dynamic get y1 => 42;

// function typed formals
void ftf0(f(int x)) {}
void ftf1(dynamic f(int x)) {}

// function expressions
var fe0 = (int x) => x as dynamic;
var fe1 = (int x) => x;
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 12, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 96, 2),
      error(HintCode.UNUSED_ELEMENT, 96, 2),
      error(HintCode.UNUSED_ELEMENT, 126, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 212, 12),
      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 304, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_RETURN, 373, 1),
    ]);
  }

  test_implicitDynamic_static() async {
    _disableTestPackageImplicitDynamic();
    await assertNoErrorsInCode(r'''
class C {
  static void test(int body()) {}
}

void main() {
  C.test(()  {
    return 42;
  });
}
''');
  }

  test_implicitDynamic_type() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
class C<T> {}
class M1<T extends List> {}
class M2<T> {}
class I<T> {}
class D<T, S> extends C
    with M1, M2
    implements I {}
class D2<T, S> = C
    with M1, M2
    implements I;

C f(D d) {
  D x = new D();
  D<int, dynamic> y = new D();
  D<dynamic, int> z = new D();
  return new C();
}

class A<T extends num> {}
class N1<T extends List<int>> {}
class N2<T extends Object> {}
class J<T extends Object> {}
class B<T extends Object> extends A with N1, N2 implements J {}
A g(B b) {
  B y = new B();
  return new A();
}
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 33, 4),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 93, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 108, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 126, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 148, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 163, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 181, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 200, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 208, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 231, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 239, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 262, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 270, 1),
      error(LanguageCode.IMPLICIT_DYNAMIC_TYPE, 288, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 493, 1),
    ]);
  }

  test_implicitDynamic_variable() async {
    _disableTestPackageImplicitDynamic();
    await assertErrorsInCode(r'''
var x0;
var x1 = (<dynamic>[])[0];
var x2, x3 = 42, x4;
dynamic y0;
dynamic y1 = (<dynamic>[])[0];
''', [
      error(LanguageCode.IMPLICIT_DYNAMIC_VARIABLE, 4, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_VARIABLE, 12, 21),
      error(LanguageCode.IMPLICIT_DYNAMIC_VARIABLE, 39, 2),
      error(LanguageCode.IMPLICIT_DYNAMIC_VARIABLE, 52, 2),
    ]);
  }

  test_interfaceOverridesAreAllChecked() {
    // Regression test for https://github.com/dart-lang/sdk/issues/29766
    return assertErrorsInCode(r'''
class B {
  set x(int y) {}
}
class C {
  set x(Object y) {}
}
class D implements B, C {
  int x;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 95, 1),
    ]);
  }

  test_interfacesFromMixinsAreChecked() {
    // Regression test for https://github.com/dart-lang/sdk/issues/29782
    return assertErrorsInCode(r'''
abstract class I {
  set x(int v);
}
abstract class M implements I {}

class C extends Object with M {
  String x;
}

abstract class M2 = Object with M;

class C2 extends Object with M2 {
  String x;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 112, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 197, 1),
    ]);
  }

  test_interfacesFromMixinsOnlyConsiderMostDerivedMember() {
    // Regression test for dart2js interface pattern in strong mode.
    return assertNoErrorsInCode(r'''
abstract class I1 { num get x; }
abstract class I2 extends I1 { int get x; }

class M1 { num get x => 0; }
class M2 { int get x => 0; }

class Base extends Object with M1 implements I1 {}
class Child extends Base with M2 implements I2 {}

class C extends Object with M1, M2 implements I1, I2 {}
''');
  }

  test_interfacesFromMixinsUsedTwiceAreChecked() {
    // Regression test for https://github.com/dart-lang/sdk/issues/29782
    return assertErrorsInCode(r'''
abstract class I<E> {
  set x(E v);
}
abstract class M<E> implements I<E> {}

class C extends Object with M<int> {
  String x;
}

abstract class D extends Object with M<num> {}
  
class E extends D with M<int> {
  int x;
}
  
class F extends D with M<int> {
  num x;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 1),
      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 186, 1),
      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 186, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 218, 1),
      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 232, 1),
      error(CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES, 232, 1),
    ]);
  }

  test_invalidOverrides_baseClassOverrideToChildInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I {
  m(A a);
}

class Base {
  m(B a) {}
}

class T1 extends Base implements I {}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 89, 2),
    ]);
  }

  test_invalidOverrides_childOverride() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Base {
    A f;
}

class T1 extends Base {
  B get f => null;
}

class T2 extends Base {
  set f(B b) => null;
}

class T3 extends Base {
  final B f;
}
class T4 extends Base {
  // two: one for the getter one for the setter.
  B f;
}

class T5 implements Base {
  B get f => null;
}

class T6 implements Base {
  set f(B b) => null;
}

class T7 implements Base {
  final B f = null;
}
class T8 implements Base {
  // two: one for the getter one for the setter.
  B f;
}
''', [
      error(CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES, 80, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 80, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 1),
      error(CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES, 124, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 177, 1),
      error(CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES, 177, 1),
      error(CompileTimeErrorCode.FINAL_NOT_INITIALIZED, 177, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 259, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 259, 1),
      error(
          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
          271,
          2),
      error(CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES, 300, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 300, 1),
      error(
          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
          320,
          2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 347, 1),
      error(CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES, 347, 1),
      error(
          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
          372,
          2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 403, 1),
      error(CompileTimeErrorCode.GETTER_NOT_ASSIGNABLE_SETTER_TYPES, 403, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 495, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 495, 1),
    ]);
  }

  test_invalidOverrides_childOverride2() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Base {
  m(A a) {}
}

class Test extends Base {
  m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 79, 1),
    ]);
  }

  test_invalidOverrides_classOverrideOfInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I {
  m(A a);
}

class T1 implements I {
  m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 81, 1),
    ]);
  }

  test_invalidOverrides_doubleOverride() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Grandparent {
  m(A a) {}
}

class Parent extends Grandparent {
  m(A a) {}
}

class Test extends Parent {
  // Reported only once
  m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 162, 1),
    ]);
  }

  test_invalidOverrides_doubleOverride2() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Grandparent {
  m(A a) {}
}

class Parent extends Grandparent {
  m(B a) {}
}

class Test extends Parent {
  m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 95, 1),
    ]);
  }

  test_invalidOverrides_grandChildOverride() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Grandparent {
  m(A a) {}
  int x;
}

class Parent extends Grandparent {
}

class Test extends Parent {
  m(B a) {}
  int x;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 135, 1),
    ]);
  }

  test_invalidOverrides_mixinOverrideOfInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I {
  m(A a);
}

class M {
  m(B a) {}
}

class T1 extends Object with M implements I {}

class U1 = Object with M implements I;
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 86, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 134, 2),
    ]);
  }

  test_invalidOverrides_mixinOverrideToBase() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Base {
    m(A a) {}
    int x;
}

class M1 {
    m(B a) {}
}

class M2 {
    int x;
}

class T1 extends Base with M1 {}
class T2 extends Base with M1, M2 {}
class T3 extends Base with M2, M1 {}

class U1 = Base with M1;
class U2 = Base with M1, M2;
class U3 = Base with M2, M1;
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 144, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 177, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 218, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 246, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 271, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 304, 2),
    ]);
  }

  test_invalidOverrides_mixinOverrideToMixin() async {
    await assertErrorsInCode('''
class A {}
class B {}

class Base {
}

class M1 {
    m(B a) {}
    int x;
}

class M2 {
    m(A a) {}
    int x;
}

class T1 extends Base with M1, M2 {}

class U1 = Base with M1, M2;
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 148, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 180, 2),
    ]);
  }

  @failingTest
  test_invalidOverrides_noDuplicateMixinOverride() async {
    // This is a regression test for a bug in an earlier implementation were
    // names were hiding errors if the first mixin override looked correct,
    // but subsequent ones did not.
    await assertNoErrorsInCode('''
class A {}
class B {}

class Base {
  m(A a) {}
}

class M1 {
  m(A a) {}
}

class M2 {
  m(B a) {}
}

class M3 {
  m(B a) {}
}

class T1 extends Base with M1, M2, M3 {}

class U1 = Base with M1, M2, M3;
''');
  }

  test_invalidOverrides_noErrorsIfSubclassCorrectlyOverrideBaseAndInterface() async {
    // This is a case were it is incorrect to say that the base class
    // incorrectly overrides the interface.
    await assertErrorsInCode('''
class A {}
class B {}

class Base {
  void m(A a) {}
}

class I1 {
  void m(B a) {}
}

class T1 extends Base implements I1 {}

class T2 extends Base implements I1 {
  void m(dynamic a) {}
}

class T3 extends Object with Base implements I1 {}

class U3 = Object with Base implements I1;

class T4 extends Object with Base implements I1 {
  void m(dynamic a) {}
}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 93, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 197, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 249, 2),
    ]);
  }

  test_invalidRuntimeChecks() async {
    await assertErrorsInCode('''
typedef int I2I(int x);
typedef int D2I(x);
typedef int II2I(int x, int y);
typedef int DI2I(x, int y);
typedef int ID2I(int x, y);
typedef int DD2I(x, y);

typedef I2D(int x);
typedef D2D(x);
typedef II2D(int x, int y);
typedef DI2D(x, int y);
typedef ID2D(int x, y);
typedef DD2D(x, y);

int foo(int x) => x;
int bar(int x, int y) => x + y;

void main() {
  bool b;
  b = foo is I2I;
  b = foo is D2I;
  b = foo is I2D;
  b = foo is D2D;

  b = bar is II2I;
  b = bar is DI2I;
  b = bar is ID2I;
  b = bar is II2D;
  b = bar is DD2I;
  b = bar is DI2D;
  b = bar is ID2D;
  b = bar is DD2D;

  // For as, the validity of checks is deferred to runtime.
  Function f;
  f = foo as I2I;
  f = foo as D2I;
  f = foo as I2D;
  f = foo as D2D;

  f = bar as II2I;
  f = bar as DI2I;
  f = bar as ID2I;
  f = bar as II2D;
  f = bar as DD2I;
  f = bar as DI2D;
  f = bar as ID2D;
  f = bar as DD2D;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 365, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 665, 1),
      error(HintCode.UNNECESSARY_CAST, 674, 10),
      error(HintCode.UNNECESSARY_CAST, 710, 10),
      error(HintCode.UNNECESSARY_CAST, 747, 11),
      error(HintCode.UNNECESSARY_CAST, 804, 11),
    ]);
  }

  test_leastUpperBounds() async {
    await assertErrorsInCode('''
typedef T Returns<T>();

// regression test for https://github.com/dart-lang/sdk/issues/26094
class A <S extends Returns<S>, T extends Returns<T>> {
  int test(bool b) {
    S s;
    T t;
    if (b) {
      return b ? s : t;
    } else {
      return s ?? t;
    }
  }
}

class B<S, T extends S> {
  T t;
  S s;
  int test(bool b) {
    return b ? t : s;
  }
}

class C {
  // Check that the least upper bound of two types with the same
  // class but different type arguments produces the pointwise
  // least upper bound of the type arguments
  int test1(bool b) {
    List<int> li;
    List<double> ld;
    return b ? li : ld;
  }
  // TODO(leafp): This case isn't handled yet.  This test checks
  // the case where two related classes are instantiated with related
  // but different types.
  Iterable<num> test2(bool b) {
    List<int> li;
    Iterable<double> id;
    int x = b ? li : id;
    return b ? li : id;
  }
}
''', [
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 214, 9),
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 251, 6),
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 344, 9),
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD, 617, 11),
      error(TodoCode.TODO, 639, 59),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 878, 1),
    ]);
  }

  test_methodOverride() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}
class C extends B {}

class Base {
  B m1(B a) => null;
  B m2(B a) => null;
  B m3(B a) => null;
  B m4(B a) => null;
  B m5(B a) => null;
  B m6(B a) => null;
}

class Child extends Base {
  A m1(A value) => null;
  C m2(C value) => null;
  A m3(C value) => null;
  C m4(A value) => null;
  m5(value) => null;
  dynamic m6(dynamic value) => null;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 227, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 252, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 277, 2),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 354, 2),
    ]);
  }

  test_methodOverride_contravariant() async {
    await assertErrorsInCode('''
abstract class A {
  bool operator ==(Object object);
}

class B implements A {}

class F {
  void f(x) {}
  void g(int x) {}
}

class G extends F {
  void f(int x) {}
  void g(dynamic x) {}
}

class H implements F {
  void f(int x) {}
  void g(dynamic x) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 156, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 224, 1),
    ]);
  }

  test_methodTearoffStrictArrow() async {
    // Regression test for https://github.com/dart-lang/sdk/issues/26393
    await assertNoErrorsInCode(r'''
class A {
  void foo(dynamic x) {}
  void test(void f(int x)) {
    test(foo);
  }
}
''');
  }

  test_mixinApplicationIsConcrete() {
    return assertErrorsInCode(r'''
class A {
  int get foo => 3;
}

class B {
  num get foo => 3.0;
}

class C = Object with B;

class D extends Object with C implements A {}
''', [
      error(CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE, 100, 1),
    ]);
  }

  test_mixinOverrideOfGrandInterface_interfaceOfAbstractSuperclass() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

abstract class Base implements I1 {}

class M {
  m(B a) {}
}

class T1 extends Base with M {}

class U1 = Base with M;
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 146, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 173, 1),
    ]);
  }

  test_mixinOverrideOfGrandInterface_interfaceOfConcreteSuperclass() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

class Base implements I1 {}

class M {
  m(B a) {}
}

class T1 extends Base with M {}

class U1 = Base with M;
''', [
      error(
          CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
          62,
          4),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 137, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 164, 1),
    ]);
  }

  test_mixinOverrideOfGrandInterface_interfaceOfInterfaceOfChild() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

abstract class I2 implements I1 {}

class M {
  m(B a) {}
}

class T1 extends Object with M implements I2 {}

class U1 = Object with M implements I2;
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 123, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 172, 2),
    ]);
  }

  test_mixinOverrideOfGrandInterface_mixinOfInterfaceOfChild() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class M1 {
    m(A a);
}

abstract class I2 extends Object with M1 {}

class M {
  m(B a) {}
}

class T1 extends Object with M implements I2 {}

class U1 = Object with M implements I2;
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 134, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 183, 2),
    ]);
  }

  test_mixinOverrideOfGrandInterface_superclassOfInterfaceOfChild() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

abstract class I2 extends I1 {}

class M {
  m(B a) {}
}

class T1 extends Object with M implements I2 {}

class U1 = Object with M implements I2;
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 120, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 169, 2),
    ]);
  }

  test_noDuplicateReports_baseTypeAndMixinOverrideSameMethodInInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

class Base {
  m(B a) {}
}

class M {
  m(B a) {}
}

// TODO(jmesserly): the `INCONSISTENT_METHOD_INHERITANCE` message is from the
// Dart 1 checking logic (using strong mode type system), it is not produced
// by the strong mode OverrideChecker.
class T1 extends Base with M implements I1 {}

class U1 = Base with M implements I1;
''', [
      error(TodoCode.TODO, 112, 74),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 309, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 356, 2),
    ]);
  }

  test_noDuplicateReports_twoGrandTypesOverrideSameMethodInInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

class Grandparent {
  m(B a) {}
}

class Parent1 extends Grandparent {
  m(B a) {}
}
class Parent2 extends Grandparent {}

// Note: otherwise both errors would be reported on this line
class T1 extends Parent1 implements I1 {}
class T2 extends Parent2 implements I1 {}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 247, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 289, 2),
    ]);
  }

  test_noDuplicateReports_twoMixinsOverrideSameMethodInInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

class M1 {
  m(B a) {}
}

class M2 {
  m(B a) {}
}

class T1 extends Object with M1, M2 implements I1 {}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 114, 2),
    ]);
  }

  test_noDuplicateReports_typeAndBaseTypeOverrideSameMethodInInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  void m(A a);
}

class Base {
  void m(B a) {}
}

class T1 extends Base implements I1 {
  void m(B a) {}
}

class T2 extends Base implements I1 {}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 139, 1),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 158, 2),
    ]);
  }

  test_noDuplicateReports_typeAndMixinOverrideSameMethodInInterface() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  void m(A a);
}

class M {
  void m(B a) {}
}

class T1 extends Object with M implements I1 {
  void m(B a) {}
}

class T2 extends Object with M implements I1 {}

class U2 = Object with M implements I1;
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 145, 1),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 164, 2),
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 213, 2),
    ]);
  }

  test_noDuplicateReports_typeOverridesSomeMethodInMultipleInterfaces() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

abstract class I2 implements I1 {
  m(A a);
}

class Base {}

class T1 implements I2 {
  m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 145, 1),
    ]);
  }

  test_nullCoalescingOperator() async {
    await assertNoErrorsInCode('''
class A {}
class C<T> {}
main() {
  A a, b;
  a ??= new A();
  b = b ?? new A();

  // downwards inference
  C<int> c, d;
  c ??= new C();
  d = d ?? new C();
}
''');
  }

  test_nullCoalescingStrictArrow() async {
    await assertNoErrorsInCode(r'''
bool _alwaysTrue(x) => true;
typedef bool TakesA<T>(T t);
class C<T> {
  TakesA<T> g;
  C(TakesA<T> f)
    : g = f ?? _alwaysTrue;
  C.a() : g = _alwaysTrue;
}
''');
  }

  test_optionalParams() async {
    // Regression test for https://github.com/dart-lang/sdk/issues/26155
    await assertErrorsInCode(r'''
void takesF(void f(int x)) {
  takesF(([x]) { bool z = x.isEven; });
  takesF((y) { bool z = y.isEven; });
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 51, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 89, 1),
    ]);
  }

  test_overrideNarrowsType() async {
    await assertErrorsInCode(r'''
class A {}
class B extends A {}

abstract class C {
  void m(A a);
  void n(B b);
}

abstract class D extends C {
  void m(B b);
  void n(A a);
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 121, 1),
    ]);
  }

  test_overrideNarrowsType_legalWithChecked() async {
    // Regression test for https://github.com/dart-lang/sdk/issues/25232
    await assertNoErrorsInCode(r'''
abstract class A { void test(A arg) { } }
abstract class B extends A { void test(covariant B arg) { } }
abstract class X implements A { }
class C extends B with X { }
class D extends B implements A { }
''');
  }

  test_overrideNarrowsType_noDuplicateError() {
    // Regression test for https://github.com/dart-lang/sdk/issues/25232
    return assertErrorsInCode(r'''
abstract class A { void test(A arg) { } }
abstract class B extends A {
  void test(B arg) { }
}
abstract class X implements A { }

class C extends B {}

class D extends B with X { }

class E extends B implements A { }
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 78, 4),
      error(CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE, 159, 1),
      error(CompileTimeErrorCode.INVALID_IMPLEMENTATION_OVERRIDE, 189, 1),
    ]);
  }

  test_privateOverride() async {
    newFile('$testPackageLibPath/helper.dart', content: r'''
import 'test.dart' as main;

class Base {
  var f1;
  var _f2;
  var _f3;
  get _f4 => null;

  int _m1() => null;
}

class GrandChild extends main.Child {
  var _f2;
  var _f3;
  var _f4;

  String _m1() => null;
}
''');

    await assertErrorsInCode('''
import 'helper.dart' as helper;

class Child extends helper.Base {
  var f1;
  var _f2;
  var _f4;

  String _m1() => null;
}
''', [
      error(HintCode.UNUSED_FIELD, 83, 3),
      error(HintCode.UNUSED_FIELD, 94, 3),
      error(HintCode.UNUSED_ELEMENT, 109, 3),
    ]);
  }

  test_proxy() {
    return assertErrorsInCode(r'''
@proxy class C {}
@proxy class D {
  var f;
  m() => null;
  operator -() => null;
  operator +(int other) => null;
  operator [](int index) => null;
  call() => null;
}

@proxy class F implements Function { noSuchMethod(i) => 42; }

m() {
  D d = new D();
  d.m();
  d.m;
  d.f;
  -d;
  d + 7;
  d[7];
  d();

  C c = new C();
  c.m();
  c.m;
  -c;
  c + 7;
  c[7];
  c();

  F f = new F();
  f();
}
''', [
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 332, 1),
      error(CompileTimeErrorCode.UNDEFINED_GETTER, 341, 1),
      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 346, 1),
      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 354, 1),
      error(CompileTimeErrorCode.UNDEFINED_OPERATOR, 362, 3),
      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 369, 1),
      error(CompileTimeErrorCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION, 394, 1),
    ]);
  }

  test_redirectingConstructor() async {
    await assertErrorsInCode('''
class A {
  A(A x) {}
  A.two() : this(3);
}
''', [
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 39, 1),
    ]);
  }

  test_relaxedCasts() async {
    await assertErrorsInCode('''
class A {}

class L<T> {}
class M<T> extends L<T> {}
//     L<dynamic|Object>
//    /              \
// M<dynamic|Object>  L<A>
//    \              /
//          M<A>
// In normal Dart, there are additional edges
//  from M<A> to M<dynamic>
//  from L<A> to M<dynamic>
//  from L<A> to L<dynamic>
void main() {
  L lOfDs;
  L<Object> lOfOs;
  L<A> lOfAs;

  M mOfDs;
  M<Object> mOfOs;
  M<A> mOfAs;

  {
    lOfDs = mOfDs;
    lOfDs = mOfOs;
    lOfDs = mOfAs;
    lOfDs = lOfDs;
    lOfDs = lOfOs;
    lOfDs = lOfAs;
    lOfDs = new L(); // Reset type propagation.
  }
  {
    lOfOs = mOfDs;
    lOfOs = mOfOs;
    lOfOs = mOfAs;
    lOfOs = lOfDs;
    lOfOs = lOfOs;
    lOfOs = lOfAs;
    lOfOs = new L<Object>(); // Reset type propagation.
  }
  {
    lOfAs = mOfDs;
    lOfAs = mOfOs;
    lOfAs = mOfAs;
    lOfAs = lOfDs;
    lOfAs = lOfOs;
    lOfAs = lOfAs;
    lOfAs = new L<A>(); // Reset type propagation.
  }
  {
    mOfDs = mOfDs;
    mOfDs = mOfOs;
    mOfDs = mOfAs;
    mOfDs = lOfDs;
    mOfDs = lOfOs;
    mOfDs = lOfAs;
    mOfDs = new M(); // Reset type propagation.
  }
  {
    mOfOs = mOfDs;
    mOfOs = mOfOs;
    mOfOs = mOfAs;
    mOfOs = lOfDs;
    mOfOs = lOfOs;
    mOfOs = lOfAs;
    mOfOs = new M<Object>(); // Reset type propagation.
  }
  {
    mOfAs = mOfDs;
    mOfAs = mOfOs;
    mOfAs = mOfAs;
    mOfAs = lOfDs;
    mOfAs = lOfOs;
    mOfAs = lOfAs;
  }
}
''', [
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 764, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 783, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1032, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 1202, 5),
    ]);
  }

  test_setterOverride() async {
    await assertErrorsInCode('''
typedef void ToVoid<T>(T x);
class F {
  void set f(ToVoid<dynamic> x) {}
  void set g(ToVoid<int> x) {}
  void set h(dynamic x) {}
  void set i(int x) {}
}

class G extends F {
  void set f(ToVoid<int> x) {}
  void set g(ToVoid<dynamic> x) {}
  void set h(int x) {}
  void set i(dynamic x) {}
}

class H implements F {
  void set f(ToVoid<int> x) {}
  void set g(ToVoid<dynamic> x) {}
  void set h(int x) {}
  void set i(dynamic x) {}
}
 ''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 220, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 255, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 362, 1),
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 397, 1),
    ]);
  }

  test_setterReturnTypes() async {
    await assertErrorsInCode('''
void voidFn() => null;
class A {
  set a(y) => 4;
  set b(y) => voidFn();
  void set c(y) => 4;
  void set d(y) => voidFn();
  int set e(y) => 4;
  int set f(y) =>
    voidFn();
  set g(y) {return 4;}
  void set h(y) {return 4;}
  int set i(y) {return 4;}
}
''', [
      error(CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, 127, 3),
      error(CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, 148, 3),
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 168, 8),
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 197, 1),
      error(CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION, 225, 1),
      error(CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, 231, 3),
    ]);
  }

  test_setterSetterOverride() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}
class C extends B {}

abstract class Base {
  void set f1(B value);
  void set f2(B value);
  void set f3(B value);
  void set f4(B value);
  void set f5(B value);
}

class Child extends Base {
  void set f1(A value) {}
  void set f2(C value) {}
  void set f3(value) {}
  void set f4(dynamic value) {}
  set f5(B value) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 263, 2),
    ]);
  }

  test_strictInference_instanceCreation() async {
    writeTestPackageAnalysisOptionsFile(
      AnalysisOptionsFileConfig(
        strictInference: true,
      ),
    );

    await assertErrorsInCode(r'''
class C<T> {
  C([T t]);
  C.of(T t);
  factory C.from(Object e) => C();
}

void f() {
  // These should be allowed:
  C<int> downwardsInferenceIsOK = C();
  C<dynamic> downwardsInferenceDynamicIsOK = C();
  var inferredFromConstructorParameterIsOK = C(42);
  var explicitDynamicIsOK = C<dynamic>(42);

  var rawConstructorCall = C();
  var factoryConstructor = C.from(42);
  var upwardsInfersDynamic = C(42 as dynamic);
  var namedConstructor = C.of(42 as dynamic);
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 126, 22),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 169, 29),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 212, 36),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 264, 19),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 309, 18),
      error(HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 330, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 341, 18),
      error(HintCode.INFERENCE_FAILURE_ON_INSTANCE_CREATION, 362, 6),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 380, 20),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 427, 16),
    ]);
  }

  test_superCallPlacement() async {
    await assertErrorsInCode('''
class Base {
  var x;
  Base() : x = 1;
}

class Derived extends Base {
  var y, z;
  Derived() : y = 1, super(), z = 2;
}

class Valid extends Base {
  var y, z;
  Valid(): y = 1, z = 2, super();
}

class AlsoValid extends Base {
  AlsoValid() : super();
}

main() => new Derived();
''', [
      error(CompileTimeErrorCode.INVALID_SUPER_INVOCATION, 105, 5),
    ]);
  }

  test_superclassOverrideOfGrandInterface_interfaceOfAbstractSuperclass() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
    m(A a);
}

abstract class Base implements I1 {
  m(B a) {}
}

class T1 extends Base {
    m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 96, 1),
    ]);
  }

  test_superclassOverrideOfGrandInterface_interfaceOfConcreteSuperclass() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

class Base implements I1 {
  m(B a) {}
}

class T1 extends Base {
  m(B a) {}
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 85, 1),
    ]);
  }

  test_superclassOverrideOfGrandInterface_interfaceOfInterfaceOfChild() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

abstract class I2 implements I1 {}

class Base {
  m(B a) {}
}

class T1 extends Base implements I2 {}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 126, 2),
    ]);
  }

  test_superclassOverrideOfGrandInterface_mixinOfInterfaceOfChild() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class M1 {
  m(A a);
}

abstract class I2 extends Object with M1 {}

class Base {
  m(B a) {}
}

class T1 extends Base implements I2 {}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 135, 2),
    ]);
  }

  test_superclassOverrideOfGrandInterface_superclassOfInterfaceOfChild() async {
    await assertErrorsInCode('''
class A {}
class B {}

abstract class I1 {
  m(A a);
}

abstract class I2 extends I1 {}

class Base {
  m(B a) {}
}

class T1 extends Base implements I2 {}
''', [
      error(CompileTimeErrorCode.INCONSISTENT_INHERITANCE, 123, 2),
    ]);
  }

  test_superConstructor() async {
    await assertErrorsInCode('''
class A { A(A x) {} }
class B extends A {
  B() : super(3);
}
''', [
      error(CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 56, 1),
    ]);
  }

  test_tearOffTreatedConsistentlyAsStrictArrow() async {
    await assertNoErrorsInCode(r'''
void foo(void f(String x)) {}

class A {
  Null bar1(dynamic x) => null;
  void bar2(dynamic x) => null;
  Null bar3(String x) => null;
  void test() {
    foo(bar1);
    foo(bar2);
    foo(bar3);
  }
}


Null baz1(dynamic x) => null;
void baz2(dynamic x) => null;
Null baz3(String x) => null;
void test() {
  foo(baz1);
  foo(baz2);
  foo(baz3);
}
''');
  }

  test_tearOffTreatedConsistentlyAsStrictArrowNamedParam() async {
    await assertNoErrorsInCode(r'''
typedef void Handler(String x);
void foo({Handler f}) {}

class A {
  Null bar1(dynamic x) => null;
  void bar2(dynamic x) => null;
  Null bar3(String x) => null;
  void test() {
    foo(f: bar1);
    foo(f: bar2);
    foo(f: bar3);
  }
}


Null baz1(dynamic x) => null;
void baz2(dynamic x) => null;
Null baz3(String x) => null;
void test() {
  foo(f: baz1);
  foo(f: baz2);
  foo(f: baz3);
}
''');
  }

  test_ternaryOperator() async {
    await assertErrorsInCode('''
abstract class Comparable<T> {
  int compareTo(T other);
  static int compare(Comparable a, Comparable b) => a.compareTo(b);
}

typedef int Comparator<T>(T a, T b);

typedef bool _Predicate<T>(T value);

class SplayTreeMap<K, V> {
  Comparator<K> _comparator;
  _Predicate _validKey;

  // The warning on assigning to _comparator is legitimate. Since K has
  // no bound, all we know is that it's object. _comparator's function
  // type is effectively:              (Object, Object) -> int
  // We are assigning it a fn of type: (Comparable, Comparable) -> int
  // There's no telling if that will work. For example, consider:
  //
  //     new SplayTreeMap<Uri>();
  //
  // This would end up calling .compareTo() on a Uri, which doesn't
  // define that since it doesn't implement Comparable.
  SplayTreeMap([int compare(K key1, K key2),
                bool isValidKey(potentialKey)])
    : _comparator = (compare == null) ? Comparable.compare : compare,
      _validKey = (isValidKey != null) ? isValidKey : ((v) => true) {

    _Predicate<Object> v = (isValidKey != null)
        ? isValidKey : ((_) => true);

    v = (isValidKey != null)
         ? v : ((_) => true);
  }
}

void main() {
  Object obj = 42;
  dynamic dyn = 42;
  int i = 42;

  // Check the boolean conversion of the condition.
  print(i ? false : true);
  print((obj) ? false : true);
  print((dyn) ? false : true);
}
''', [
      error(HintCode.UNUSED_FIELD, 247, 11),
      error(HintCode.UNUSED_FIELD, 273, 9),
      error(CompileTimeErrorCode.NON_BOOL_CONDITION, 1311, 1),
    ]);
  }

  test_typeCheckingLiterals() async {
    await assertErrorsInCode('''
test() {
  num n = 3;
  int i = 3;
  String s = "hello";
  {
     List<int> l = <int>[i];
     l = <int>[s];
     l = <int>[n];
     l = <int>[i, n, s];
  }
  {
     List l = [i];
     l = [s];
     l = [n];
     l = [i, n, s];
  }
  {
     Map<String, int> m = <String, int>{s: i};
     m = <String, int>{s: s};
     m = <String, int>{s: n};
     m = <String, int>{s: i, s: n, s: s};
  }
 // TODO(leafp): We can't currently test for key errors since the
 // error marker binds to the entire entry.
  {
     Map m = {s: i};
     m = {s: s};
     m = {s: n};
     m = {s: i, s: n, s: s};
     m = {i: s, n: s, s: s};
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 76, 1),
      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 105, 1),
      error(CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE, 149, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 171, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 258, 1),
      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 309, 1),
      error(CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE, 381, 1),
      error(TodoCode.TODO, 393, 61),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 512, 1),
    ]);
  }

  test_typePromotionFromDynamic() async {
    await assertErrorsInCode(r'''
f() {
  dynamic x;
  if (x is int) {
    int y = x;
    String z = x;
  }
}
g() {
  Object x;
  if (x is int) {
    int y = x;
    String z = x;
  }
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 45, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 63, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 67, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 120, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 138, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 142, 1),
    ]);
  }

  test_typePromotionFromTypeParameter() async {
    // Regression test for:
    // https://github.com/dart-lang/sdk/issues/26965
    // https://github.com/dart-lang/sdk/issues/27040
    await assertErrorsInCode(r'''
void f<T>(T object) {
  if (object is String) print(object.substring(1));
}
void g<T extends num>(T object) {
  if (object is int) print(object.isEven);
  if (object is String) print(object.substring(1));
}
class Cloneable<T> {}
class SubCloneable<T> extends Cloneable<T> {
  T m(T t) => t;
}
void takesSubCloneable<A>(SubCloneable<A> t) {}

void h<T extends Cloneable<T>>(T object) {
  if (object is SubCloneable<T>) {
    print(object.m(object));

    SubCloneable<T> s = object;
    takesSubCloneable<T>(object);
    // Issue #35799: According to the language team, this should work, but both
    // analyzer and CFE currently reject it, likely due to a strange
    // representation of promoted type variables.
    // h(object);
  }
}
''', [
      error(CompileTimeErrorCode.UNDEFINED_METHOD, 190, 9),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 470, 1),
    ]);
  }

  test_typePromotionFromTypeParameterAndInference() async {
    // Regression test for:
    // https://github.com/dart-lang/sdk/issues/27040
    await assertErrorsInCode(r'''
void f<T extends num>(T x, T y) {
  var z = x;
  var f = () => x;
  f = () => y;
  if (x is int) {
    z.isEven;
    var q = x;
    q = z;
    f().isEven;

    // This captures the type `T extends int`.
    var g = () => x;
    g = f;
    g().isEven;
    q = g();
    int r = x;
  }
}
''', [
      error(CompileTimeErrorCode.UNDEFINED_GETTER, 105, 6),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 121, 1),
      error(CompileTimeErrorCode.UNDEFINED_GETTER, 147, 6),
      error(CompileTimeErrorCode.UNDEFINED_GETTER, 243, 6),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 272, 1),
    ]);
  }

  test_typeSubtyping_assigningClass() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

void main() {
   dynamic y;
   Object o;
   int i = 0;
   double d = 0.0;
   num n;
   A a;
   B b;
   y = a;
   o = a;
   i = a;
   d = a;
   n = a;
   a = a;
   b = a;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 58, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 71, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 98, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 114, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 130, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 160, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 170, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 180, 1),
    ]);
  }

  test_typeSubtyping_assigningSubclass() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}
class C extends A {}

void main() {
   dynamic y;
   Object o;
   int i = 0;
   double d = 0.0;
   num n;
   A a;
   B b;
   C c;
   y = b;
   o = b;
   i = b;
   d = b;
   n = b;
   a = b;
   b = b;
   c = b;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 79, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 92, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 102, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 119, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 135, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 143, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 159, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 189, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 199, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 209, 1),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 239, 1),
    ]);
  }

  test_typeSubtyping_dynamicDowncasts() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

void main() {
   dynamic y;
   Object o;
   int i = 0;
   double d = 0.0;
   num n;
   A a;
   B b;
   o = y;
   i = y;
   d = y;
   n = y;
   a = y;
   b = y;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 71, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 81, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 98, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 114, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 122, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 130, 1),
    ]);
  }

  test_typeSubtyping_dynamicIsTop() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}

void main() {
   dynamic y;
   Object o;
   int i = 0;
   double d = 0.0;
   num n;
   A a;
   B b;
   y = o;
   y = i;
   y = d;
   y = n;
   y = a;
   y = b;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 58, 1),
    ]);
  }

  test_typeSubtyping_interfaces() async {
    await assertErrorsInCode('''
class A {}
class B extends A {}
class C extends A {}
class D extends B implements C {}

void main() {
   A top;
   B left;
   C right;
   D bot;
   {
     top = top;
     top = left;
     top = right;
     top = bot;
   }
   {
     left = top;
     left = left;
     left = right;
     left = bot;
   }
   {
     right = top;
     right = left;
     right = right;
     right = bot;
   }
   {
     bot = top;
     bot = left;
     bot = right;
     bot = bot;
   }
}
''', [
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 274, 5),
      error(CompileTimeErrorCode.INVALID_ASSIGNMENT, 339, 4),
    ]);
  }

  test_unaryOperators() async {
    await assertErrorsInCode('''
class A {
  A operator ~() => null;
  A operator +(int x) => null;
  A operator -(int x) => null;
  A operator -() => null;
}
class B extends A {}
class C extends B {}

foo() => new A();

test() {
  A a = new A();
  B b = new B();
  var c = foo();
  dynamic d;

  ~a;
  (~d);

  !a;
  !d;

  -a;
  (-d);

  ++a;
  --a;
  (++d);
  (--d);

  a++;
  a--;
  (d++);
  (d--);

  ++b;
  --b;
  b++;
  b--;

  takesC(C c) => null;
  takesC(++b);
  takesC(--b);
  takesC(b++);
  takesC(b--);
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 201, 1),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 237, 1),
      error(CompileTimeErrorCode.NON_BOOL_NEGATION_EXPRESSION, 280, 1),
    ]);
  }

  test_unboundRedirectingConstructor() async {
    // This is a regression test for https://github.com/dart-lang/sdk/issues/25071
    await assertErrorsInCode('''
class Foo {
  Foo() : this.init();
}
 ''', [
      error(CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR, 22,
          11),
    ]);
  }

  test_unboundTypeName() async {
    await assertErrorsInCode('''
void main() {
  AToB y;
}
''', [
      error(CompileTimeErrorCode.UNDEFINED_CLASS, 16, 4),
      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
    ]);
  }

  test_unboundVariable() async {
    await assertErrorsInCode('''
void main() {
   dynamic y = unboundVariable;
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 25, 1),
      error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 29, 15),
    ]);
  }

  test_universalFunctionSubtyping() async {
    await assertErrorsInCode(r'''
dynamic foo<T>(dynamic x) => x;

void takesDtoD(dynamic f(dynamic x)) {}

void test() {
  // here we currently infer an instantiation.
  takesDtoD(foo);
}

class A {
  dynamic method(dynamic x) => x;
}

class B extends A {
  T method<T>(T x) => x;
}
''', [
      error(CompileTimeErrorCode.INVALID_OVERRIDE, 227, 6),
    ]);
  }

  test_voidSubtyping() async {
    // Regression test for https://github.com/dart-lang/sdk/issues/25069
    await assertErrorsInCode('''
typedef int Foo();
void foo() {}
void main () {
  Foo x = foo();
}
''', [
      error(HintCode.UNUSED_LOCAL_VARIABLE, 54, 1),
      error(CompileTimeErrorCode.USE_OF_VOID_RESULT, 58, 3),
    ]);
  }

  void _disableTestPackageImplicitDynamic() {
    writeTestPackageAnalysisOptionsFile(
      AnalysisOptionsFileConfig(
        implicitDynamic: false,
      ),
    );
  }
}
