Skip to content

Commit 7263b35

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Infer constness in enum element initializers
Part of #47453 Closes #48233 Change-Id: Iaa75ccac6622e874da5f6e5feb053fc19a220936 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/232382 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 9863451 commit 7263b35

10 files changed

+175
-1
lines changed

pkg/front_end/lib/src/fasta/source/source_enum_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ class SourceEnumBuilder extends SourceClassBuilder {
614614
// be built via a body builder to detect potential errors.
615615
bodyBuilder = library.loader.createBodyBuilderForOutlineExpression(
616616
library, this, this, scope, fileUri);
617-
bodyBuilder.constantContext = ConstantContext.required;
617+
bodyBuilder.constantContext = ConstantContext.inferred;
618618
}
619619

620620
if (enumConstantInfo.argumentsBeginToken != null) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
enum E {
6+
v([]); // No error.
7+
const E(_);
8+
}
9+
10+
main() {}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E v = #C3;
8+
const constructor •(core::int index, core::String name, dynamic _) → self::E
9+
: super core::_Enum::•(index, name)
10+
;
11+
method toString() → core::String
12+
return "E.${this.{core::_Enum::_name}{core::String}}";
13+
}
14+
static method main() → dynamic {}
15+
16+
constants {
17+
#C1 = 0
18+
#C2 = "v"
19+
#C3 = self::E {index:#C1, _name:#C2}
20+
#C4 = <self::E>[#C3]
21+
}
22+
23+
24+
Constructor coverage from constants:
25+
org-dartlang-testcase:///issue48232.dart:
26+
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
27+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
28+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E v = #C3;
8+
const constructor •(core::int index, core::String name, dynamic _) → self::E
9+
: super core::_Enum::•(index, name)
10+
;
11+
method toString() → core::String
12+
return "E.${this.{core::_Enum::_name}{core::String}}";
13+
}
14+
static method main() → dynamic {}
15+
16+
constants {
17+
#C1 = 0
18+
#C2 = "v"
19+
#C3 = self::E {index:#C1, _name:#C2}
20+
#C4 = <self::E>[#C3]
21+
}
22+
23+
24+
Constructor coverage from constants:
25+
org-dartlang-testcase:///issue48232.dart:
26+
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
27+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
28+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
enum E { v([]); const E(_); }
2+
main() {}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E v = #C3;
8+
const constructor •(core::int index, core::String name, dynamic _) → self::E
9+
: super core::_Enum::•(index, name)
10+
;
11+
method toString() → core::String
12+
return "E.${this.{core::_Enum::_name}{core::String}}";
13+
}
14+
static method main() → dynamic {}
15+
16+
constants {
17+
#C1 = 0
18+
#C2 = "v"
19+
#C3 = self::E {index:#C1, _name:#C2}
20+
#C4 = <self::E*>[#C3]
21+
}
22+
23+
24+
Constructor coverage from constants:
25+
org-dartlang-testcase:///issue48232.dart:
26+
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
27+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
28+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E v = #C3;
8+
const constructor •(core::int index, core::String name, dynamic _) → self::E
9+
: super core::_Enum::•(index, name)
10+
;
11+
method toString() → core::String
12+
return "E.${this.{core::_Enum::_name}{core::String}}";
13+
}
14+
static method main() → dynamic {}
15+
16+
constants {
17+
#C1 = 0
18+
#C2 = "v"
19+
#C3 = self::E {index:#C1, _name:#C2}
20+
#C4 = <self::E*>[#C3]
21+
}
22+
23+
24+
Constructor coverage from constants:
25+
org-dartlang-testcase:///issue48232.dart:
26+
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
27+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
28+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = const <self::E>[self::E::v];
7+
static const field self::E v = const self::E::•(0, "v", const <dynamic>[]);
8+
const constructor •(core::int index, core::String name, dynamic _) → self::E
9+
: super core::_Enum::•(index, name)
10+
;
11+
method toString() → core::String
12+
return "E.${this.{core::_Enum::_name}{core::String}}";
13+
}
14+
static method main() → dynamic
15+
;
16+
17+
18+
Extra constant evaluation status:
19+
Evaluated: ListLiteral @ org-dartlang-testcase:///issue48232.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "v"}])
20+
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48232.dart:6:5 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "v"})
21+
Extra constant evaluation: evaluated: 7, effectively constant: 2
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E v = #C3;
8+
const constructor •(core::int index, core::String name, dynamic _) → self::E
9+
: super core::_Enum::•(index, name)
10+
;
11+
method toString() → core::String
12+
return "E.${this.{core::_Enum::_name}{core::String}}";
13+
}
14+
static method main() → dynamic {}
15+
16+
constants {
17+
#C1 = 0
18+
#C2 = "v"
19+
#C3 = self::E {index:#C1, _name:#C2}
20+
#C4 = <self::E*>[#C3]
21+
}
22+
23+
24+
Constructor coverage from constants:
25+
org-dartlang-testcase:///issue48232.dart:
26+
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
27+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
28+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

pkg/front_end/testcases/textual_outline.status

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ enhanced_enums/inference_in_constructor_parameters: FormatterCrash
3535
enhanced_enums/instantiated_generic_enum_types: FormatterCrash
3636
enhanced_enums/issue48084: FormatterCrash
3737
enhanced_enums/issue48181: FormatterCrash
38+
enhanced_enums/issue48232: FormatterCrash
3839
enhanced_enums/malformed_constructors: FormatterCrash
3940
enhanced_enums/members: FormatterCrash
4041
enhanced_enums/named_arguments: FormatterCrash

0 commit comments

Comments
 (0)