// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

// VMOptions=--optimization_counter_threshold=10 --deterministic

// Regression test for https://dartbug.com/40792 and https://dartbug.com/40795.
// Verifies that non-nullability is not inferred from 'is' tests which
// accept null.

import "package:expect/expect.dart";

dynamic result;

// Use separate functions so their parameter types can be inferred separately.
setResult1(x) {
  result = (x == null) ? 'null' : 'not null';
}

setResult2(x) {
  result = (x == null) ? 'null' : 'not null';
}

setResult3(x) {
  result = (x == null) ? 'null' : 'not null';
}

setResult4(x) {
  result = (x == null) ? 'null' : 'not null';
}

setResult5(x) {
  result = (x == null) ? 'null' : 'not null';
}

setResult6(x) {
  result = (x == null) ? 'null' : 'not null';
}

setResult7(x) {
  result = (x == null) ? 'null' : 'not null';
}

class A<S, T extends S> {
  @pragma('vm:never-inline')
  test1(S x) {
    if (x is T) {
      setResult1(x);
    }
  }

  @pragma('vm:never-inline')
  test2(S x) {
    if (x is T) {
      setResult2(x);
    }
  }

  @pragma('vm:never-inline')
  test3(S x) {
    if (x is T) {
      setResult2(x);
    }
  }

  @pragma('vm:never-inline')
  test4(S x) {
    if (x is T) {
      setResult2(x);
    }
  }
}

@pragma('vm:never-inline')
test5(x) {
  if (x is Null) {
    setResult5(x);
  }
}

@pragma('vm:never-inline')
test6(x) {
  if (x is Object) {
    setResult6(x);
  }
}

@pragma('vm:never-inline')
test7(x) {
  if (x is dynamic) {
    setResult7(x);
  }
}

void doTests() {
  result = 'unexpected';
  new A<Null, Null>().test1(null);
  Expect.equals('null', result);

  result = 'unexpected';
  new A<Object, Object>().test2(null);
  Expect.equals('null', result);

  result = 'unexpected';
  new A<dynamic, dynamic>().test3(null);
  Expect.equals('null', result);

  result = 'unexpected';
  new A<void, void>().test4(null);
  Expect.equals('null', result);

  result = 'unexpected';
  test5(null);
  Expect.equals('null', result);

  result = 'unexpected';
  test6(null);
  Expect.equals('null', result);

  result = 'unexpected';
  test7(null);
  Expect.equals('null', result);
}

main(List<String> args) {
  for (int i = 0; i < 20; ++i) {
    doTests();
  }
}
