Skip to content

Commit

Permalink
Fixes dart-lang#3030. Add additional test checking non const in a con…
Browse files Browse the repository at this point in the history
…st constructor initializer list
  • Loading branch information
sgrekhov committed Jan 7, 2025
1 parent 43b9788 commit abf5976
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
/// constant constructor were treated as compile-time constants that were
/// guaranteed to evaluate to an integer, boolean or string value as required
/// by their immediately enclosing superexpression.
///
/// @description Checks that it is a compile-time error when a constant
/// constructor's initializer list contains non-constant list literal.
/// @author iefremov

class A {
final x;
const A(var p) : x = [p];
Expand All @@ -25,7 +25,5 @@ class A {
}

main() {
const A(1);
// ^
// [analyzer] unspecified
print(A);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,33 @@
/// constant constructor were treated as compile-time constants that were
/// guaranteed to evaluate to an integer, boolean or string value as required
/// by their immediately enclosing superexpression.
///
/// @description Checks that it is a compile-time error when a constant
/// constructor's initializer list contains an instance creation expression.
/// constructor's initializer list contains a function call.
/// @author iefremov
f1() {}
int f2() => 2;
int get f3 => 3;

class A {
final x;
const A() : x = new List.from([]);
// ^^^
const A() : x = f1();
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified

const A.foo() : x = f2();
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified

const A.bar() : x = f3;
// ^^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
const A();
// ^
// [analyzer] unspecified
print(A);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,24 @@
/// constant constructor were treated as compile-time constants that were
/// guaranteed to evaluate to an integer, boolean or string value as required
/// by their immediately enclosing superexpression.
///
/// @description Checks that it is a compile-time error when a constant
/// constructor's initializer list contains a function call.
/// constructor's initializer list contains an non-constant instance creation
/// expression.
/// @author iefremov

f() {}

class A {
const A();
}

class C {
final x;
const A() : x = f();
// ^^^
const C() : x = new A();
// ^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
const A();
// ^
// [analyzer] unspecified
print(C);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) 2025, 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.

/// @assertion Any expression that appears within the initializer list of a
/// constant constructor must be a potentially constant expression, or a
/// compile-time error occurs.
///
/// A potentially constant expression is an expression E that would be a valid
/// constant expression if all formal parameters of E's immediately enclosing
/// constant constructor were treated as compile-time constants that were
/// guaranteed to evaluate to an integer, boolean or string value as required
/// by their immediately enclosing superexpression.
///
/// @description Checks that it is a compile-time error when a constant
/// constructor's initializer list contains a use of a non-constant.
/// @author [email protected]
/// @issue 59804
class A {
final int id;
const A(this.id);
static A answer = const A(42);
}

final A zero = const A(0);

class C {
final A a;
const C(this.a);
const C.fromAnswer() : a = A.answer;
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified

const C.fromGlobal() : a = zero;
// ^^^^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(C);
}

0 comments on commit abf5976

Please sign in to comment.