// 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. 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 foo([ p1 = C(), //# 4: compile-time error p2 = const C(), p3 = const C(C()), ]) => [p2, p3]; // Default value of named optional parameter. static List 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]); }