[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 <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2021-09-08 12:43:35 +00:00 committed by commit-bot@chromium.org
parent 4a54307a39
commit fbc70d8be6
6 changed files with 26 additions and 11 deletions

View file

@ -32,10 +32,14 @@ abstract class _C&A&B extends self::A implements self::B<core::num> /*isAnonymou
synthetic constructor •() → self::_C&A&B
: super self::A::•()
;
abstract set boz(generic-covariant-impl core::num x) → void;
abstract method foo(generic-covariant-impl core::num x) → core::num;
abstract method bar({required generic-covariant-impl core::num x = #C1}) → core::num;
abstract set baz(generic-covariant-impl core::num x) → void;
set boz(generic-covariant-impl core::num x) → void
return super.{self::A::boz} = x as core::int;
method foo(generic-covariant-impl core::num x) → core::num
return super.{self::A::foo}(x as core::int);
method bar({required generic-covariant-impl core::num x = #C1}) → core::num
return super.{self::A::bar}(x: x as core::int);
set baz(generic-covariant-impl core::num x) → void
return super.{self::A::baz} = x as core::int;
}
class C extends self::_C&A&B {
synthetic constructor •() → self::C

View file

@ -21,7 +21,8 @@ abstract class _C&A&B extends self::A implements self::B<core::num> /*isAnonymou
synthetic constructor •() → self::_C&A&B
: super self::A::•()
;
abstract method foo(generic-covariant-impl core::num x) → core::num;
method foo(generic-covariant-impl core::num x) → core::num
return super.{self::A::foo}(x);
}
class C extends self::_C&A&B {
synthetic constructor •() → self::C

View file

@ -30,7 +30,8 @@ class Class extends self::Super implements self::Interface, self::Mixin /*isElim
;
abstract method extendedConcreteMixedInAbstractMethod() → void;
method extendedConcreteMixedInConcreteMethod() → void {}
abstract method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void;
method extendedConcreteMixedInAbstractImplementedMethod(covariant core::int i) → void
return super.{self::Super::extendedConcreteMixedInAbstractImplementedMethod}(i);
method extendedConcreteMixedInConcreteImplementedMethod(covariant core::int i) → void {}
}
class Sub extends self::Class {

View file

@ -84,8 +84,6 @@ general/issue41210a: TypeCheckError
general/issue41210b/issue41210.no_link: TypeCheckError
general/issue41210b/issue41210: TypeCheckError
general/issue44733: TypeCheckError
general/issue46389: RuntimeError # issue 46389
general/issue46390: RuntimeError # issue 46390
general/issue_46886: RuntimeError
general/micro: RuntimeError
general/mixin_application_override: TypeCheckError

View file

@ -88,8 +88,6 @@ general/issue41210a: TypeCheckError
general/issue41210b/issue41210.no_link: TypeCheckError
general/issue41210b/issue41210: TypeCheckError
general/issue44733: TypeCheckError
general/issue46389: RuntimeError # issue 46389
general/issue46390: RuntimeError # issue 46390
general/issue_46886: RuntimeError
general/micro: RuntimeError
general/mixin_application_override: ExpectationFileMismatch # Too many errors.

View file

@ -146,7 +146,9 @@ class MixinFullResolution {
class_.addField(clone);
}
class_.procedures.clear();
class_.procedures..addAll(nonSetters.values)..addAll(setters.values);
class_.procedures
..addAll(nonSetters.values)
..addAll(setters.values);
}
// Existing procedures in the class should only be forwarding stubs.
@ -190,6 +192,17 @@ class MixinFullResolution {
// and don't add several procedures with the same name to the class.
continue outer;
}
if (procedure.isAbstract &&
(originalProcedure.stubKind ==
ProcedureStubKind.ConcreteForwardingStub ||
originalProcedure.stubKind ==
ProcedureStubKind.ConcreteMixinStub)) {
// Don't replace concrete stubs with abstract methods.
originalProcedure.stubKind = ProcedureStubKind.Regular;
originalProcedure.stubTarget = null;
continue outer;
}
originalIndex = i;
break;
}