| // Copyright (c) 2019, 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 |
| |
| import "package:expect/expect.dart"; |
| |
| // Check places that are *not* supposed to be constant contexts, |
| // but which do require constant values, do not introduce an implicit const. |
| // Nested expressions still do. |
| // (Also acts as regression test for http:/dartbug.com/36533) |
| |
| class C { |
| final v; |
| |
| // Initializer of final field in class with const constructor. |
| // Can't use `const C()`, it's a cyclic constant dependency. |
| final i1 = []; //# 1: compile-time error |
| final i2 = const []; |
| final i3 = const [[]]; |
| |
| const C([this.v]); |
| |
| // Initializer expression in generative const constructor. |
| const C.c1() : v = C(); //# 2: compile-time error |
| const C.c2() : v = const C(); |
| const C.c3() : v = const C(C()); |
| |
| // Expression in redirecting generative const constuctor. |
| const C.r1() : this(C()); //# 3: compile-time error |
| const C.r2() : this(const C()); |
| const C.r3() : this(const C(C())); |
| |
| // Default value of positional optional parameter. |
| static List<C> foo([ |
| p1 = C(), //# 4: compile-time error |
| p2 = const C(), |
| p3 = const C(C()), |
| ]) => |
| [p2, p3]; |
| |
| // Default value of named optional parameter. |
| static List<C> bar({ |
| p1 = C(), //# 5: compile-time error |
| p2 = const C(), |
| p3 = const C(C()), |
| }) => |
| [p2, p3]; |
| } |
| |
| void main() { |
| var c = const C(); |
| var cc = const C(C()); |
| |
| // Check that const constructors can be invoked without `const`, |
| // creating new instances every time. |
| var nc1 = C(); |
| var nc2 = C.c2(); |
| var nc3 = C.c3(); |
| var nc4 = C.r2(); |
| var nc5 = C.r3(); |
| Expect.allDistinct([nc1, nc2, nc3, nc4, nc5, c, cc]); |
| |
| // Check that const invocations create identical objects. |
| Expect.identical(c, C.c2().v); |
| Expect.identical(cc, C.c3().v); |
| |
| Expect.identical(c, C.r2().v); |
| Expect.identical(cc, C.r3().v); |
| |
| Expect.identical(const [], C().i2); |
| Expect.identical(const [[]], C().i3); |
| |
| Expect.identical(c, C.foo()[0]); |
| Expect.identical(cc, C.foo()[1]); |
| |
| Expect.identical(c, C.bar()[0]); |
| Expect.identical(cc, C.bar()[1]); |
| } |