/*
 * Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion CONST_CANONICAL_TYPE(R Function<X extends B>(S)) = F*
 *   where F = R1 Function<X extends B1>(S1)
 *   and R1 = CONST_CANONICAL_TYPE(R)
 *   and B1 = CONST_CANONICAL_TYPE(B)
 *   and S1 = CONST_CANONICAL_TYPE(S)
 * Note, this generalizes to arbitrary number of type and term parameters.
 *
 * @description Checks that CONST_CANONICAL_TYPE(R Function<X extends B>(S)) = F*
 *
 * @author iarkh@unipro.ru
 */
// Requirements=nnbd-strong

import "../../Utils/expect.dart";
import "const_evaluation_lib.dart";

typedef FUNC = int Function<X extends String>(double);

int testme<X extends String>(double d) => throw "Should not reach here";

const c = C<FUNC?>(testme);
const c1 = C<FUNC?>(null);

dynamic d = null;
Never n = throw "Should not reach here";
dynamic d1 = 1;

void test1() => c1.test(testme);
void test2() => c1.test(null);
void test3() => c1.test(d);
void test4() => c1.test(n);
void test5() => c1.test(d1);

main() {
  test1();
  test2();
  test3();
  Expect.throws(() => test4());
  Expect.throws(() => test5());
}
