blob: 8f8d999dcd7db9b65269f172d3d0c3d3bb003efa [file] [log] [blame]
// 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]);
}