Skip to content

Commit fbc70d8

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Don't replace concrete stubs with abstract methods in mixin transformation
Closes #46389 Closes #46390 Change-Id: If3446d08d0feaf8f778dc396bbed1ebb1c5c0bc7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/212745 Reviewed-by: Dmitry Stefantsov <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 4a54307 commit fbc70d8

File tree

6 files changed

+26
-11
lines changed

6 files changed

+26
-11
lines changed

pkg/front_end/testcases/general/issue46389.dart.weak.transformed.expect

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,14 @@ abstract class _C&A&B extends self::A implements self::B<core::num> /*isAnonymou
3232
synthetic constructor •() → self::_C&A&B
3333
: super self::A::•()
3434
;
35-
abstract set boz(generic-covariant-impl core::num x) → void;
36-
abstract method foo(generic-covariant-impl core::num x) → core::num;
37-
abstract method bar({required generic-covariant-impl core::num x = #C1}) → core::num;
38-
abstract set baz(generic-covariant-impl core::num x) → void;
35+
set boz(generic-covariant-impl core::num x) → void
36+
return super.{self::A::boz} = x as core::int;
37+
method foo(generic-covariant-impl core::num x) → core::num
38+
return super.{self::A::foo}(x as core::int);
39+
method bar({required generic-covariant-impl core::num x = #C1}) → core::num
40+
return super.{self::A::bar}(x: x as core::int);
41+
set baz(generic-covariant-impl core::num x) → void
42+
return super.{self::A::baz} = x as core::int;
3943
}
4044
class C extends self::_C&A&B {
4145
synthetic constructor •() → self::C

pkg/front_end/testcases/general/issue46390.dart.weak.transformed.expect

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ abstract class _C&A&B extends self::A implements self::B<core::num> /*isAnonymou
2121
synthetic constructor •() → self::_C&A&B
2222
: super self::A::•()
2323
;
24-
abstract method foo(generic-covariant-impl core::num x) → core::num;
24+
method foo(generic-covariant-impl core::num x) → core::num
25+
return super.{self::A::foo}(x);
2526
}
2627
class C extends self::_C&A&B {
2728
synthetic constructor •() → self::C

pkg/front_end/testcases/nnbd_mixed/hierarchy/abstract_mixin.dart.weak.transformed.expect

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class Class extends self::Super implements self::Interface, self::Mixin /*isElim
3030
;
3131
abstract method extendedConcreteMixedInAbstractMethod() → void;
3232
method extendedConcreteMixedInConcreteMethod() → void {}
33-
abstract method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void;
33+
method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void
34+
return super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(i);
3435
method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void {}
3536
}
3637
class Sub extends self::Class {

pkg/front_end/testcases/text_serialization.status

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ general/issue41210a: TypeCheckError
8484
general/issue41210b/issue41210.no_link: TypeCheckError
8585
general/issue41210b/issue41210: TypeCheckError
8686
general/issue44733: TypeCheckError
87-
general/issue46389: RuntimeError # issue 46389
88-
general/issue46390: RuntimeError # issue 46390
8987
general/issue_46886: RuntimeError
9088
general/micro: RuntimeError
9189
general/mixin_application_override: TypeCheckError

pkg/front_end/testcases/weak.status

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ general/issue41210a: TypeCheckError
8888
general/issue41210b/issue41210.no_link: TypeCheckError
8989
general/issue41210b/issue41210: TypeCheckError
9090
general/issue44733: TypeCheckError
91-
general/issue46389: RuntimeError # issue 46389
92-
general/issue46390: RuntimeError # issue 46390
9391
general/issue_46886: RuntimeError
9492
general/micro: RuntimeError
9593
general/mixin_application_override: ExpectationFileMismatch # Too many errors.

pkg/kernel/lib/transformations/mixin_full_resolution.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ class MixinFullResolution {
146146
class_.addField(clone);
147147
}
148148
class_.procedures.clear();
149-
class_.procedures..addAll(nonSetters.values)..addAll(setters.values);
149+
class_.procedures
150+
..addAll(nonSetters.values)
151+
..addAll(setters.values);
150152
}
151153

152154
// Existing procedures in the class should only be forwarding stubs.
@@ -190,6 +192,17 @@ class MixinFullResolution {
190192
// and don't add several procedures with the same name to the class.
191193
continue outer;
192194
}
195+
if (procedure.isAbstract &&
196+
(originalProcedure.stubKind ==
197+
ProcedureStubKind.ConcreteForwardingStub ||
198+
originalProcedure.stubKind ==
199+
ProcedureStubKind.ConcreteMixinStub)) {
200+
// Don't replace concrete stubs with abstract methods.
201+
originalProcedure.stubKind = ProcedureStubKind.Regular;
202+
originalProcedure.stubTarget = null;
203+
continue outer;
204+
}
205+
193206
originalIndex = i;
194207
break;
195208
}

0 commit comments

Comments
 (0)