mirror of
https://github.com/dart-lang/sdk
synced 2024-09-15 23:09:48 +00:00
[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:
parent
4a54307a39
commit
fbc70d8be6
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue