-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[cfe] Ensure that enum constructors are created during outline
Enum constructors for enums with mixins were not built in the outline phase because code assumes that initializers have to be present in order to have a non-trivial constant constructor. Closes #56681 Change-Id: Id614e3cde24ba3649db9ca67d938ba21575d7454 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/384264 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Jens Johansen <jensj@google.com>
- Loading branch information
1 parent
3c1c13d
commit e106b7b
Showing
41 changed files
with
757 additions
and
151 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// Copyright (c) 2024, 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 'main_lib.dart'; | ||
|
||
void main() { | ||
const a = SomeEnum.value; | ||
final b = SomeEnum.value; | ||
|
||
print('a == b: ${a == b}'); | ||
print('a hash: ${a.hashCode}'); | ||
print('b hash: ${b.hashCode}'); | ||
} |
56 changes: 56 additions & 0 deletions
56
pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.expect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
library; | ||
import self as self; | ||
import "main_lib.dart" as mai; | ||
import "dart:core" as core; | ||
|
||
import "org-dartlang-testcase:///main_lib.dart"; | ||
|
||
static method main() → void { | ||
const mai::SomeEnum a = #C3; | ||
final mai::SomeEnum b = mai::SomeEnum::value; | ||
core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}"); | ||
core::print("a hash: ${a.{core::Object::hashCode}{core::int}}"); | ||
core::print("b hash: ${b.{core::Object::hashCode}{core::int}}"); | ||
} | ||
|
||
library; | ||
import self as mai; | ||
import "dart:core" as core; | ||
|
||
abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ { | ||
abstract get someField() → core::String; | ||
} | ||
abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with mai::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ { | ||
const synthetic constructor •(core::int index, core::String _name) → mai::_SomeEnum&_Enum&HasSomeField | ||
: super core::_Enum::•(index, _name) | ||
; | ||
abstract mixin-stub get someField() → core::String; -> mai::HasSomeField::someField | ||
} | ||
class SomeEnum extends mai::_SomeEnum&_Enum&HasSomeField /*isEnum*/ { | ||
static const field core::List<mai::SomeEnum> values = #C4; | ||
enum-element static const field mai::SomeEnum value = #C3; | ||
const synthetic constructor •(core::int #index, core::String #name) → mai::SomeEnum | ||
: super mai::_SomeEnum&_Enum&HasSomeField::•(#index, #name) | ||
; | ||
method _enumToString() → core::String | ||
return "SomeEnum.${this.{core::_Enum::_name}{core::String}}"; | ||
@#C5 | ||
get someField() → core::String | ||
return "field"; | ||
} | ||
|
||
constants { | ||
#C1 = 0.0 | ||
#C2 = "value" | ||
#C3 = mai::SomeEnum {index:#C1, _name:#C2} | ||
#C4 = <mai::SomeEnum>[#C3] | ||
#C5 = core::_Override {} | ||
} | ||
|
||
|
||
Constructor coverage from constants: | ||
org-dartlang-testcase:///main_lib.dart: | ||
- SomeEnum. (from org-dartlang-testcase:///main_lib.dart:9:6) | ||
- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///main_lib.dart:9:6) | ||
- _Enum. (from org-dartlang-sdk:///lib/core/enum.dart) | ||
- Object. (from org-dartlang-sdk:///lib/core/object.dart) |
20 changes: 20 additions & 0 deletions
20
pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.modular.expect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
library; | ||
import self as self; | ||
import "main_lib.dart" as mai; | ||
import "dart:core" as core; | ||
|
||
import "org-dartlang-testcase:///main_lib.dart"; | ||
|
||
static method main() → void { | ||
const mai::SomeEnum a = #C3; | ||
final mai::SomeEnum b = mai::SomeEnum::value; | ||
core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}"); | ||
core::print("a hash: ${a.{core::Object::hashCode}{core::int}}"); | ||
core::print("b hash: ${b.{core::Object::hashCode}{core::int}}"); | ||
} | ||
|
||
constants { | ||
#C1 = 0.0 | ||
#C2 = "value" | ||
#C3 = mai::SomeEnum {index:#C1, _name:#C2} | ||
} |
40 changes: 40 additions & 0 deletions
40
pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.outline.expect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
library; | ||
import self as self; | ||
|
||
import "org-dartlang-testcase:///main_lib.dart"; | ||
|
||
static method main() → void | ||
; | ||
|
||
library; | ||
import self as self2; | ||
import "dart:core" as core; | ||
|
||
abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ { | ||
abstract get someField() → core::String; | ||
} | ||
abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with self2::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ { | ||
const synthetic constructor •(core::int index, core::String _name) → self2::_SomeEnum&_Enum&HasSomeField | ||
: super core::_Enum::•(index, _name) | ||
; | ||
abstract mixin-stub get someField() → core::String; -> self2::HasSomeField::someField | ||
} | ||
class SomeEnum extends self2::_SomeEnum&_Enum&HasSomeField /*isEnum*/ { | ||
static const field core::List<self2::SomeEnum> values = const <self2::SomeEnum>[self2::SomeEnum::value]; | ||
enum-element static const field self2::SomeEnum value = const self2::SomeEnum::•(0, "value"); | ||
const synthetic constructor •(core::int #index, core::String #name) → self2::SomeEnum | ||
: super self2::_SomeEnum&_Enum&HasSomeField::•(#index, #name) | ||
; | ||
method _enumToString() → core::String | ||
return "SomeEnum.${this.{core::_Enum::_name}{core::String}}"; | ||
@core::override | ||
get someField() → core::String | ||
; | ||
} | ||
|
||
|
||
Extra constant evaluation status: | ||
Evaluated: StaticGet @ org-dartlang-testcase:///main_lib.dart:12:4 -> InstanceConstant(const _Override{}) | ||
Evaluated: ListLiteral @ org-dartlang-testcase:///main_lib.dart:9:6 -> ListConstant(const <SomeEnum>[const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"}]) | ||
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///main_lib.dart:10:3 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"}) | ||
Extra constant evaluation: evaluated: 10, effectively constant: 3 |
62 changes: 62 additions & 0 deletions
62
pkg/front_end/testcases/dartdevc/issue56681/main.dart.strong.transformed.expect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
library; | ||
import self as self; | ||
import "main_lib.dart" as mai; | ||
import "dart:core" as core; | ||
|
||
import "org-dartlang-testcase:///main_lib.dart"; | ||
|
||
static method main() → void { | ||
const mai::SomeEnum a = #C3; | ||
final mai::SomeEnum b = mai::SomeEnum::value; | ||
core::print("a == b: ${a =={core::Object::==}{(core::Object) → core::bool} b}"); | ||
core::print("a hash: ${a.{core::Object::hashCode}{core::int}}"); | ||
core::print("b hash: ${b.{core::Object::hashCode}{core::int}}"); | ||
} | ||
|
||
library; | ||
import self as mai; | ||
import "dart:core" as core; | ||
|
||
abstract class HasSomeField extends core::Object /*isMixinDeclaration*/ { | ||
abstract get someField() → core::String; | ||
} | ||
abstract class _SomeEnum&_Enum&HasSomeField = core::_Enum with mai::HasSomeField /*isAnonymousMixin,hasConstConstructor*/ { | ||
const synthetic constructor •(core::int index, core::String _name) → mai::_SomeEnum&_Enum&HasSomeField | ||
: super core::_Enum::•(index, _name) | ||
; | ||
abstract mixin-stub get someField() → core::String; -> mai::HasSomeField::someField | ||
} | ||
class SomeEnum extends mai::_SomeEnum&_Enum&HasSomeField /*isEnum*/ { | ||
static const field core::List<mai::SomeEnum> values = #C4; | ||
enum-element static const field mai::SomeEnum value = #C3; | ||
const synthetic constructor •(core::int #index, core::String #name) → mai::SomeEnum | ||
: super mai::_SomeEnum&_Enum&HasSomeField::•(#index, #name) | ||
; | ||
method _enumToString() → core::String | ||
return "SomeEnum.${this.{core::_Enum::_name}{core::String}}"; | ||
@#C5 | ||
get someField() → core::String | ||
return "field"; | ||
} | ||
|
||
constants { | ||
#C1 = 0.0 | ||
#C2 = "value" | ||
#C3 = mai::SomeEnum {index:#C1, _name:#C2} | ||
#C4 = <mai::SomeEnum>[#C3] | ||
#C5 = core::_Override {} | ||
} | ||
|
||
Extra constant evaluation status: | ||
Evaluated: StaticGet @ org-dartlang-testcase:///main.dart:9:22 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"}) | ||
Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:11:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"}) | ||
Evaluated: VariableGetImpl @ org-dartlang-testcase:///main.dart:12:20 -> InstanceConstant(const SomeEnum{_Enum.index: 0.0, _Enum._name: "value"}) | ||
Extra constant evaluation: evaluated: 21, effectively constant: 3 | ||
|
||
|
||
Constructor coverage from constants: | ||
org-dartlang-testcase:///main_lib.dart: | ||
- SomeEnum. (from org-dartlang-testcase:///main_lib.dart:9:6) | ||
- _SomeEnum&_Enum&HasSomeField. (from org-dartlang-testcase:///main_lib.dart:9:6) | ||
- _Enum. (from org-dartlang-sdk:///lib/core/enum.dart) | ||
- Object. (from org-dartlang-sdk:///lib/core/object.dart) |
3 changes: 3 additions & 0 deletions
3
pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline.expect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
import 'main_lib.dart'; | ||
|
||
void main() {} |
3 changes: 3 additions & 0 deletions
3
pkg/front_end/testcases/dartdevc/issue56681/main.dart.textual_outline_modelled.expect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
import 'main_lib.dart'; | ||
|
||
void main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// Copyright (c) 2024, 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. | ||
|
||
mixin HasSomeField { | ||
String get someField; | ||
} | ||
|
||
enum SomeEnum with HasSomeField { | ||
value; | ||
|
||
@override | ||
String get someField => 'field'; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
main_lib.dart |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.