| // Copyright (c) 2018, 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:expect/expect.dart"; |
| |
| // Test that an omitted `new` is allowed for a generic constructor invocation. |
| |
| class C<T> { |
| final T x; |
| C(this.x); // Not const constructor. |
| const C.c(this.x); // Const constructor. |
| |
| operator <(other) => this; |
| operator >(other) => other; |
| operator -() => this; |
| |
| C<T> get self => this; |
| C<T> method() => self; |
| } |
| |
| T id<T>(T x) => x; |
| |
| main() { |
| const cc = const C<int>.c(42); // Canonicalized. |
| |
| var c0 = new C<int>(42); // Original syntax. |
| |
| // Uses of `C<int>(42)` in various contexts. |
| var c1 = C<int>(42); |
| var c2 = [C<int>(42)][0]; |
| var c3 = {C<int>(42): 0}.keys.first; |
| var c4 = {0: C<int>(42)}.values.first; |
| var c5 = id(C<int>(42)); |
| var c6 = C<int>(42).self; |
| var c7 = C<int>(42).method(); |
| var c8 = C(C<int>(42)).x; |
| var c9 = -C<int>(42); |
| var c10 = C<int>(42) < 9; |
| var c11 = C(null) > C<int>(42); |
| var c12 = (c10 == c11) ? null : C<int>(42); |
| var c13 = C<int>(42)..method(); |
| var c14; |
| try { |
| throw C<int>(42); |
| } catch (e) { |
| c14 = e; |
| } |
| |
| switch (C<int>(42)) { |
| case cc: |
| Expect.fail("Should not be const"); |
| break; |
| default: |
| // Success. |
| } |
| |
| for (C<int>(42); false; C<int>(42), C<int>(42)) { |
| Expect.fail("Unreachable"); |
| } |
| |
| var values = [ |
| cc, |
| c0, |
| c1, |
| c2, |
| c3, |
| c4, |
| c5, |
| c6, |
| c7, |
| c8, |
| c9, |
| c10, |
| c11, |
| c12, |
| c13, |
| c14 |
| ]; |
| Expect.allDistinct(values); // Non of them create constants. |
| for (var value in values) { |
| Expect.isTrue(value is C<int>); |
| Expect.equals(42, (value as C<int>).x); |
| } |
| } |