| // 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. |
| |
| // SharedOptions=--enable-experiment=constructor-tearoffs |
| |
| // Test the support for generic function instantiation with constant and |
| // potentially constant expressions. Include both some explicit generic |
| // function instantiations, and some implicit ones (for the latter, the type |
| // arguments are derived by type inference based on the context type). The |
| // main goal is to test the new feature where the underlying function is |
| // given as an existing function object, which also implies that there are |
| // several new possible syntactic forms, e.g., `(b ? f1 : f2)<int>`. |
| |
| import 'instantiated_function_constant_test.dart' as prefix; |
| |
| void f1<X extends num>(X x, [num n = 0, List<X> xList = const []]) {} |
| void f2<Y extends num>(Y y, [int i = 1, Map<Y, Y> yMap = const {}]) {} |
| |
| const b = true; |
| |
| const c01 = f1; |
| const c02 = f2; |
| |
| // Explicitly instantiate function declaration. |
| const c03 = f1<int>; |
| const c04 = prefix.f2<int>; |
| const c05 = prefix.f1<int>; |
| const c06 = f2<int>; |
| |
| // Explicitly instantiate constant variable. |
| const c07 = prefix.c01<int>; |
| const c08 = c02<int>; |
| const c09 = c01<int>; |
| const c10 = prefix.c02<int>; |
| |
| // Implicitly instantiate function declaration. |
| const void Function(double) c11 = f1; |
| const void Function(Never, [int, Map<int, int>]) c12 = prefix.f2; |
| |
| // Implicitly instantiate constant variable. |
| const void Function(double) c13 = prefix.c01; |
| const void Function(Never, [int, Map<int, int>]) c14 = c02; |
| |
| // Test new potentially constant expressions. A type variable is a potentially |
| // constant type expression, so there are no errors in the initializer list. |
| class A<U extends num> { |
| final x1, x2, x3, x4, x5, x6; |
| final void Function(U) x7; |
| final void Function(U) x8; |
| final void Function(U, [int, Map<num, Never>]) x9; |
| final void Function(U) x10; |
| final void Function(num) x11; |
| final void Function(double) x12; |
| final void Function(num, [int, Map<num, Never>]) x13; |
| final void Function(int) x14; |
| |
| const A(bool b) |
| : x1 = b ? (b ? f1 : prefix.f2)<U> : (b ? f1 : prefix.f2)<int>, |
| x2 = b ? (b ? prefix.c01 : c02)<U> : (b ? prefix.c01 : c02)<int>, |
| x3 = b ? ((b ? prefix.f1 : f2))<U> : ((b ? prefix.f1 : f2))<int>, |
| x4 = b ? ((b ? c01 : prefix.c02))<U> : ((b ? c01 : prefix.c02))<int>, |
| x5 = b ? (null ?? f1)<U> : (null ?? f1)<int>, |
| x6 = b |
| ? ((c01 as dynamic) as void Function<X extends num>(X, |
| [num, List<X>]))<U> |
| : ((c01 as dynamic) as void Function<X extends num>(X, |
| [num, List<X>]))<int>, |
| x7 = b ? f1 : f2, |
| x8 = b ? c01 : c02, |
| x9 = null ?? c02, |
| x10 = |
| (c01 as dynamic) as void Function<X extends num>(X, [int, List<X>]), |
| x11 = b ? f1 : f2, |
| x12 = b ? c01 : c02, |
| x13 = null ?? c02, |
| x14 = |
| (c01 as dynamic) as void Function<X extends num>(X, [int, List<X>]); |
| } |
| |
| void main() { |
| const ff = false; |
| const A<double>(true); |
| const A<num>(ff); |
| } |