Skip to content

Commit 5224f34

Browse files
jensjohaCommit Queue
authored andcommitted
[CFE] Fix (another) crash in extension type with declared instance field
Change-Id: I4d8d99c8bdd1077039ae70fcb041c9396734dd75 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/399161 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent 38e250b commit 5224f34

File tree

48 files changed

+386
-212
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+386
-212
lines changed

pkg/front_end/lib/src/source/source_field_builder.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ class SourceFieldBuilder extends SourceMemberBuilderImpl
179179
isAbstract: true,
180180
isExternal: false,
181181
isFinal: isFinal,
182-
isCovariantByDeclaration: isCovariantByDeclaration);
182+
isCovariantByDeclaration: isCovariantByDeclaration,
183+
isForcedExtension: true);
183184
}
184185
} else if (isLate &&
185186
libraryBuilder.loader.target.backendTarget.isLateFieldLoweringEnabled(
@@ -1754,11 +1755,12 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
17541755
{required this.isAbstract,
17551756
required this.isExternal,
17561757
required bool isFinal,
1757-
required bool isCovariantByDeclaration})
1758-
: _isExtensionInstanceMember = isExternal &&
1758+
required bool isCovariantByDeclaration,
1759+
bool isForcedExtension = false})
1760+
: _isExtensionInstanceMember = (isExternal || isForcedExtension) &&
17591761
nameScheme.isExtensionMember &&
17601762
nameScheme.isInstanceMember,
1761-
_isExtensionTypeInstanceMember = isExternal &&
1763+
_isExtensionTypeInstanceMember = (isExternal || isForcedExtension) &&
17621764
nameScheme.isExtensionTypeMember &&
17631765
nameScheme.isInstanceMember {
17641766
if (_isExtensionInstanceMember || _isExtensionTypeInstanceMember) {

pkg/front_end/testcases/extension_types/extension_type_declarations.dart.strong.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ extension type ExtensionType3<T extends core::num>(T it) {
2727
}
2828
extension type ExtensionType4(core::int it) {
2929
abstract extension-type-member representation-field get it() → core::int;
30-
get field = get self::ExtensionType4|field;
30+
get field = self::ExtensionType4|get#field;
3131
get getter = self::ExtensionType4|get#getter;
3232
method method = self::ExtensionType4|method;
3333
method tearoff method = self::ExtensionType4|get#method;
@@ -110,7 +110,7 @@ static extension-type-member method ExtensionType4|constructor#redirectingFactor
110110
return self::ExtensionType4|constructor#(it);
111111
static extension-type-member method ExtensionType4|constructor#_#redirectingFactory#tearOff(core::int it) → self::ExtensionType4% /* erasure=core::int, declared=! */
112112
return self::ExtensionType4|constructor#(it);
113-
static abstract extension-type-member get ExtensionType4|field() → core::int;
113+
static abstract extension-type-member method ExtensionType4|get#field(lowered core::int #this) → core::int;
114114
static extension-type-member method ExtensionType4|get#getter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this) → core::int
115115
return #this as{Unchecked} core::int;
116116
static extension-type-member method ExtensionType4|set#setter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this, core::int value) → void {}

pkg/front_end/testcases/extension_types/extension_type_declarations.dart.strong.modular.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ extension type ExtensionType3<T extends core::num>(T it) {
2727
}
2828
extension type ExtensionType4(core::int it) {
2929
abstract extension-type-member representation-field get it() → core::int;
30-
get field = get self::ExtensionType4|field;
30+
get field = self::ExtensionType4|get#field;
3131
get getter = self::ExtensionType4|get#getter;
3232
method method = self::ExtensionType4|method;
3333
method tearoff method = self::ExtensionType4|get#method;
@@ -110,7 +110,7 @@ static extension-type-member method ExtensionType4|constructor#redirectingFactor
110110
return self::ExtensionType4|constructor#(it);
111111
static extension-type-member method ExtensionType4|constructor#_#redirectingFactory#tearOff(core::int it) → self::ExtensionType4% /* erasure=core::int, declared=! */
112112
return self::ExtensionType4|constructor#(it);
113-
static abstract extension-type-member get ExtensionType4|field() → core::int;
113+
static abstract extension-type-member method ExtensionType4|get#field(lowered core::int #this) → core::int;
114114
static extension-type-member method ExtensionType4|get#getter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this) → core::int
115115
return #this as{Unchecked} core::int;
116116
static extension-type-member method ExtensionType4|set#setter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this, core::int value) → void {}

pkg/front_end/testcases/extension_types/extension_type_declarations.dart.strong.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ extension type ExtensionType3<T extends core::num>(T it) {
2727
}
2828
extension type ExtensionType4(core::int it) {
2929
abstract extension-type-member representation-field get it() → core::int;
30-
get field = get self::ExtensionType4|field;
30+
get field = self::ExtensionType4|get#field;
3131
get getter = self::ExtensionType4|get#getter;
3232
method method = self::ExtensionType4|method;
3333
method tearoff method = self::ExtensionType4|get#method;
@@ -102,7 +102,7 @@ static extension-type-member method ExtensionType4|constructor#redirectingFactor
102102
return self::ExtensionType4|constructor#(it);
103103
static extension-type-member method ExtensionType4|constructor#_#redirectingFactory#tearOff(core::int it) → self::ExtensionType4% /* erasure=core::int, declared=! */
104104
return self::ExtensionType4|constructor#(it);
105-
static abstract extension-type-member get ExtensionType4|field() → core::int;
105+
static abstract extension-type-member method ExtensionType4|get#field(lowered core::int #this) → core::int;
106106
static extension-type-member method ExtensionType4|get#getter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this) → core::int
107107
;
108108
static extension-type-member method ExtensionType4|set#setter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this, core::int value) → void

pkg/front_end/testcases/extension_types/extension_type_declarations.dart.strong.transformed.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ extension type ExtensionType3<T extends core::num>(T it) {
2727
}
2828
extension type ExtensionType4(core::int it) {
2929
abstract extension-type-member representation-field get it() → core::int;
30-
get field = get self::ExtensionType4|field;
30+
get field = self::ExtensionType4|get#field;
3131
get getter = self::ExtensionType4|get#getter;
3232
method method = self::ExtensionType4|method;
3333
method tearoff method = self::ExtensionType4|get#method;
@@ -110,7 +110,7 @@ static extension-type-member method ExtensionType4|constructor#redirectingFactor
110110
return self::ExtensionType4|constructor#(it);
111111
static extension-type-member method ExtensionType4|constructor#_#redirectingFactory#tearOff(core::int it) → self::ExtensionType4% /* erasure=core::int, declared=! */
112112
return self::ExtensionType4|constructor#(it);
113-
static abstract extension-type-member get ExtensionType4|field() → core::int;
113+
static abstract extension-type-member method ExtensionType4|get#field(lowered core::int #this) → core::int;
114114
static extension-type-member method ExtensionType4|get#getter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this) → core::int
115115
return #this as{Unchecked} core::int;
116116
static extension-type-member method ExtensionType4|set#setter(lowered final self::ExtensionType4% /* erasure=core::int, declared=! */ #this, core::int value) → void {}

pkg/front_end/testcases/extension_types/field_initializer.dart.strong.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ extension type ET1(core::int id) {
3434
}
3535
extension type ET2(core::int id) {
3636
abstract extension-type-member representation-field get id() → core::int;
37-
get x = get self::ET2|x;
38-
set x = set self::ET2|x;
37+
get x = self::ET2|get#x;
38+
set x = self::ET2|set#x;
3939
constructor • = self::ET2|constructor#;
4040
constructor tearoff • = self::ET2|constructor#_#new#tearOff;
4141
}
4242
extension type ET3(core::int id) {
4343
abstract extension-type-member representation-field get id() → core::int;
44-
get x = get self::ET3|x;
44+
get x = self::ET3|get#x;
4545
constructor • = self::ET3|constructor#;
4646
constructor tearoff • = self::ET3|constructor#_#new#tearOff;
4747
}
@@ -60,12 +60,12 @@ static extension-type-member method ET2|constructor#(core::int id) → self::ET2
6060
}
6161
static extension-type-member method ET2|constructor#_#new#tearOff(core::int id) → self::ET2% /* erasure=core::int, declared=! */
6262
return self::ET2|constructor#(id);
63-
static abstract extension-type-member get ET2|x() → core::int;
64-
static abstract extension-type-member set ET2|x(synthesized core::int #externalFieldValue) → void;
63+
static abstract extension-type-member method ET2|get#x(lowered core::int #this) → core::int;
64+
static abstract extension-type-member method ET2|set#x(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
6565
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */ {
6666
lowered final self::ET3% /* erasure=core::int, declared=! */ #this = id;
6767
return #this;
6868
}
6969
static extension-type-member method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
7070
return self::ET3|constructor#(id);
71-
static abstract extension-type-member get ET3|x() → core::int;
71+
static abstract extension-type-member method ET3|get#x(lowered core::int #this) → core::int;

pkg/front_end/testcases/extension_types/field_initializer.dart.strong.modular.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ extension type ET1(core::int id) {
3434
}
3535
extension type ET2(core::int id) {
3636
abstract extension-type-member representation-field get id() → core::int;
37-
get x = get self::ET2|x;
38-
set x = set self::ET2|x;
37+
get x = self::ET2|get#x;
38+
set x = self::ET2|set#x;
3939
constructor • = self::ET2|constructor#;
4040
constructor tearoff • = self::ET2|constructor#_#new#tearOff;
4141
}
4242
extension type ET3(core::int id) {
4343
abstract extension-type-member representation-field get id() → core::int;
44-
get x = get self::ET3|x;
44+
get x = self::ET3|get#x;
4545
constructor • = self::ET3|constructor#;
4646
constructor tearoff • = self::ET3|constructor#_#new#tearOff;
4747
}
@@ -60,12 +60,12 @@ static extension-type-member method ET2|constructor#(core::int id) → self::ET2
6060
}
6161
static extension-type-member method ET2|constructor#_#new#tearOff(core::int id) → self::ET2% /* erasure=core::int, declared=! */
6262
return self::ET2|constructor#(id);
63-
static abstract extension-type-member get ET2|x() → core::int;
64-
static abstract extension-type-member set ET2|x(synthesized core::int #externalFieldValue) → void;
63+
static abstract extension-type-member method ET2|get#x(lowered core::int #this) → core::int;
64+
static abstract extension-type-member method ET2|set#x(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
6565
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */ {
6666
lowered final self::ET3% /* erasure=core::int, declared=! */ #this = id;
6767
return #this;
6868
}
6969
static extension-type-member method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
7070
return self::ET3|constructor#(id);
71-
static abstract extension-type-member get ET3|x() → core::int;
71+
static abstract extension-type-member method ET3|get#x(lowered core::int #this) → core::int;

pkg/front_end/testcases/extension_types/field_initializer.dart.strong.outline.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ extension type ET1(core::int id) {
3434
}
3535
extension type ET2(core::int id) {
3636
abstract extension-type-member representation-field get id() → core::int;
37-
get x = get self::ET2|x;
38-
set x = set self::ET2|x;
37+
get x = self::ET2|get#x;
38+
set x = self::ET2|set#x;
3939
constructor • = self::ET2|constructor#;
4040
constructor tearoff • = self::ET2|constructor#_#new#tearOff;
4141
}
4242
extension type ET3(core::int id) {
4343
abstract extension-type-member representation-field get id() → core::int;
44-
get x = get self::ET3|x;
44+
get x = self::ET3|get#x;
4545
constructor • = self::ET3|constructor#;
4646
constructor tearoff • = self::ET3|constructor#_#new#tearOff;
4747
}
@@ -53,10 +53,10 @@ static extension-type-member method ET2|constructor#(core::int id) → self::ET2
5353
;
5454
static extension-type-member method ET2|constructor#_#new#tearOff(core::int id) → self::ET2% /* erasure=core::int, declared=! */
5555
return self::ET2|constructor#(id);
56-
static abstract extension-type-member get ET2|x() → core::int;
57-
static abstract extension-type-member set ET2|x(synthesized core::int #externalFieldValue) → void;
56+
static abstract extension-type-member method ET2|get#x(lowered core::int #this) → core::int;
57+
static abstract extension-type-member method ET2|set#x(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
5858
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */
5959
;
6060
static extension-type-member method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
6161
return self::ET3|constructor#(id);
62-
static abstract extension-type-member get ET3|x() → core::int;
62+
static abstract extension-type-member method ET3|get#x(lowered core::int #this) → core::int;

pkg/front_end/testcases/extension_types/field_initializer.dart.strong.transformed.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ extension type ET1(core::int id) {
3434
}
3535
extension type ET2(core::int id) {
3636
abstract extension-type-member representation-field get id() → core::int;
37-
get x = get self::ET2|x;
38-
set x = set self::ET2|x;
37+
get x = self::ET2|get#x;
38+
set x = self::ET2|set#x;
3939
constructor • = self::ET2|constructor#;
4040
constructor tearoff • = self::ET2|constructor#_#new#tearOff;
4141
}
4242
extension type ET3(core::int id) {
4343
abstract extension-type-member representation-field get id() → core::int;
44-
get x = get self::ET3|x;
44+
get x = self::ET3|get#x;
4545
constructor • = self::ET3|constructor#;
4646
constructor tearoff • = self::ET3|constructor#_#new#tearOff;
4747
}
@@ -60,12 +60,12 @@ static extension-type-member method ET2|constructor#(core::int id) → self::ET2
6060
}
6161
static extension-type-member method ET2|constructor#_#new#tearOff(core::int id) → self::ET2% /* erasure=core::int, declared=! */
6262
return self::ET2|constructor#(id);
63-
static abstract extension-type-member get ET2|x() → core::int;
64-
static abstract extension-type-member set ET2|x(synthesized core::int #externalFieldValue) → void;
63+
static abstract extension-type-member method ET2|get#x(lowered core::int #this) → core::int;
64+
static abstract extension-type-member method ET2|set#x(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
6565
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */ {
6666
lowered final self::ET3% /* erasure=core::int, declared=! */ #this = id;
6767
return #this;
6868
}
6969
static extension-type-member method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
7070
return self::ET3|constructor#(id);
71-
static abstract extension-type-member get ET3|x() → core::int;
71+
static abstract extension-type-member method ET3|get#x(lowered core::int #this) → core::int;

pkg/front_end/testcases/extension_types/late_fields.dart.strong.expect

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,20 @@ extension type ET1(core::int id) {
3939
}
4040
extension type ET2(core::int id) {
4141
abstract extension-type-member representation-field get id() → core::int;
42-
get x = get self::ET2|x;
43-
set x = set self::ET2|x;
42+
get x = self::ET2|get#x;
43+
set x = self::ET2|set#x;
4444
constructor • = self::ET2|constructor#;
4545
constructor tearoff • = self::ET2|constructor#_#new#tearOff;
4646
}
4747
extension type ET3(core::int id) {
4848
abstract extension-type-member representation-field get id() → core::int;
49-
get x = get self::ET3|x;
49+
get x = self::ET3|get#x;
5050
constructor • = self::ET3|constructor#;
5151
constructor tearoff • = self::ET3|constructor#_#new#tearOff;
5252
}
5353
extension type ET4(core::int id) {
5454
abstract extension-type-member representation-field get id() → core::int;
55-
get x = get self::ET4|x;
55+
get x = self::ET4|get#x;
5656
constructor • = self::ET4|constructor#;
5757
constructor tearoff • = self::ET4|constructor#_#new#tearOff;
5858
}
@@ -71,22 +71,22 @@ static extension-type-member method ET2|constructor#(core::int id) → self::ET2
7171
}
7272
static extension-type-member method ET2|constructor#_#new#tearOff(core::int id) → self::ET2% /* erasure=core::int, declared=! */
7373
return self::ET2|constructor#(id);
74-
static abstract extension-type-member get ET2|x() → core::int;
75-
static abstract extension-type-member set ET2|x(synthesized core::int #externalFieldValue) → void;
74+
static abstract extension-type-member method ET2|get#x(lowered core::int #this) → core::int;
75+
static abstract extension-type-member method ET2|set#x(lowered core::int #this, synthesized core::int #externalFieldValue) → void;
7676
static extension-type-member method ET3|constructor#(core::int id) → self::ET3% /* erasure=core::int, declared=! */ {
7777
lowered final self::ET3% /* erasure=core::int, declared=! */ #this = id;
7878
return #this;
7979
}
8080
static extension-type-member method ET3|constructor#_#new#tearOff(core::int id) → self::ET3% /* erasure=core::int, declared=! */
8181
return self::ET3|constructor#(id);
82-
static abstract extension-type-member get ET3|x() → core::int;
82+
static abstract extension-type-member method ET3|get#x(lowered core::int #this) → core::int;
8383
static extension-type-member method ET4|constructor#(core::int id) → self::ET4% /* erasure=core::int, declared=! */ {
8484
lowered final self::ET4% /* erasure=core::int, declared=! */ #this = id;
8585
return #this;
8686
}
8787
static extension-type-member method ET4|constructor#_#new#tearOff(core::int id) → self::ET4% /* erasure=core::int, declared=! */
8888
return self::ET4|constructor#(id);
89-
static abstract extension-type-member get ET4|x() → core::int;
89+
static abstract extension-type-member method ET4|get#x(lowered core::int #this) → core::int;
9090
static method main() → dynamic {
9191
core::print(#C1);
9292
core::print(#C1);

0 commit comments

Comments
 (0)