Skip to content

Commit

Permalink
[cfe] Infer constness in enum element initializers
Browse files Browse the repository at this point in the history
Part of #47453

Closes #48233

Change-Id: Iaa75ccac6622e874da5f6e5feb053fc19a220936
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/232382
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
  • Loading branch information
chloestefantsova authored and Commit Bot committed Feb 11, 2022
1 parent 9863451 commit 7263b35
Show file tree
Hide file tree
Showing 10 changed files with 175 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,7 @@ class SourceEnumBuilder extends SourceClassBuilder {
// be built via a body builder to detect potential errors.
bodyBuilder = library.loader.createBodyBuilderForOutlineExpression(
library, this, this, scope, fileUri);
bodyBuilder.constantContext = ConstantContext.required;
bodyBuilder.constantContext = ConstantContext.inferred;
}

if (enumConstantInfo.argumentsBeginToken != null) {
Expand Down
10 changes: 10 additions & 0 deletions pkg/front_end/testcases/enhanced_enums/issue48232.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Copyright (c) 2022, 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.

enum E {
v([]); // No error.
const E(_);
}

main() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E v = #C3;
const constructor •(core::int index, core::String name, dynamic _) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants {
#C1 = 0
#C2 = "v"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = <self::E>[#C3]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue48232.dart:
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E v = #C3;
const constructor •(core::int index, core::String name, dynamic _) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants {
#C1 = 0
#C2 = "v"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = <self::E>[#C3]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue48232.dart:
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
enum E { v([]); const E(_); }
main() {}
28 changes: 28 additions & 0 deletions pkg/front_end/testcases/enhanced_enums/issue48232.dart.weak.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E v = #C3;
const constructor •(core::int index, core::String name, dynamic _) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants {
#C1 = 0
#C2 = "v"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = <self::E*>[#C3]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue48232.dart:
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E v = #C3;
const constructor •(core::int index, core::String name, dynamic _) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants {
#C1 = 0
#C2 = "v"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = <self::E*>[#C3]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue48232.dart:
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = const <self::E>[self::E::v];
static const field self::E v = const self::E::•(0, "v", const <dynamic>[]);
const constructor •(core::int index, core::String name, dynamic _) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic
;


Extra constant evaluation status:
Evaluated: ListLiteral @ org-dartlang-testcase:///issue48232.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "v"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue48232.dart:6:5 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "v"})
Extra constant evaluation: evaluated: 7, effectively constant: 2
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class E extends core::_Enum /*isEnum*/ {
static const field core::List<self::E> values = #C4;
static const field self::E v = #C3;
const constructor •(core::int index, core::String name, dynamic _) → self::E
: super core::_Enum::•(index, name)
;
method toString() → core::String
return "E.${this.{core::_Enum::_name}{core::String}}";
}
static method main() → dynamic {}

constants {
#C1 = 0
#C2 = "v"
#C3 = self::E {index:#C1, _name:#C2}
#C4 = <self::E*>[#C3]
}


Constructor coverage from constants:
org-dartlang-testcase:///issue48232.dart:
- E. (from org-dartlang-testcase:///issue48232.dart:7:9)
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
1 change: 1 addition & 0 deletions pkg/front_end/testcases/textual_outline.status
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ enhanced_enums/inference_in_constructor_parameters: FormatterCrash
enhanced_enums/instantiated_generic_enum_types: FormatterCrash
enhanced_enums/issue48084: FormatterCrash
enhanced_enums/issue48181: FormatterCrash
enhanced_enums/issue48232: FormatterCrash
enhanced_enums/malformed_constructors: FormatterCrash
enhanced_enums/members: FormatterCrash
enhanced_enums/named_arguments: FormatterCrash
Expand Down

0 comments on commit 7263b35

Please sign in to comment.