[dart2js] Handle super access in mixin declarations

This crashed because the canonical name for the replace procedure
was unbound before all references to it had been loaded, causing
subsequent reads of the canonical name to create reference without
a target.

This broke the flutter web smoke tests.

Change-Id: I6249cfda85ff76b5e2dd31bb0cf8d6312ad50c1d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/177861
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index bbad224..49c87e2 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -419,12 +419,15 @@
           ir.Procedure existingSetter = existingSetters[field.name];
           cls.addField(cloneVisitor.cloneField(
               field, existingGetter?.reference, existingSetter?.reference));
+          // TODO(johnniwinther): We need to unbind the canonical names before
+          // serializing these references since the canonical names refer to
+          // @getters and @setters instead of @fields and @fields=. This will
+          // not be needed if stop using @fields/@fields= in favor of
+          // @getters/@setters in general.
           if (existingGetter != null) {
-            existingGetter.reference.canonicalName?.unbind();
             cls.procedures.remove(existingGetter);
           }
           if (existingSetter != null) {
-            existingSetter.reference.canonicalName?.unbind();
             cls.procedures.remove(existingSetter);
           }
           continue;
@@ -444,7 +447,6 @@
                   ? existingSetters[procedure.name]
                   : existingNonSetters[procedure.name];
           if (existingProcedure != null) {
-            existingProcedure.reference.canonicalName?.unbind();
             cls.procedures.remove(existingProcedure);
           }
           cls.addProcedure(cloneVisitor.cloneProcedure(
diff --git a/pkg/front_end/test/spell_checking_list_tests.txt b/pkg/front_end/test/spell_checking_list_tests.txt
index 74205c3..c2db70b 100644
--- a/pkg/front_end/test/spell_checking_list_tests.txt
+++ b/pkg/front_end/test/spell_checking_list_tests.txt
@@ -606,6 +606,7 @@
 scheduler
 screen
 scripts
+scroll
 sdkroot
 sdks
 secondary
diff --git a/pkg/front_end/testcases/none/mixin_super.dart b/pkg/front_end/testcases/none/mixin_super.dart
new file mode 100644
index 0000000..5b90234
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.md file.
+
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+
+main() {
+  new PointerScrollEvent()
+      .debugFillProperties(new DiagnosticPropertiesBuilder());
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect
new file mode 100644
index 0000000..6e052ce
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.outline.expect
@@ -0,0 +1,61 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    ;
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @core::override
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    ;
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    ;
+  @core::override
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    ;
+}
+static method main() → dynamic
+  ;
+
+
+Extra constant evaluation status:
+Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:16:4 -> InstanceConstant(const _Override{})
+Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:25:4 -> InstanceConstant(const _Override{})
+Extra constant evaluation: evaluated: 6, effectively constant: 2
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.strong.transformed.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect
new file mode 100644
index 0000000..dd59658
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..e011475
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.textual_outline_modelled.expect
@@ -0,0 +1,21 @@
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+class DiagnosticPropertiesBuilder {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+main() {}
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect
new file mode 100644
index 0000000..9929e69
--- /dev/null
+++ b/pkg/front_end/testcases/none/mixin_super.dart.weak.transformed.expect
@@ -0,0 +1,65 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/  {
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
+}
+class DiagnosticPropertiesBuilder extends core::Object {
+  synthetic constructor •() → self::DiagnosticPropertiesBuilder
+    : super core::Object::•()
+    ;
+}
+abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/  {
+  const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
+    : super core::Object::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::Diagnosticable::debugFillProperties}(properties);
+}
+abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
+  synthetic constructor •() → self::PointerEvent
+    : super self::_PointerEvent&Object&Diagnosticable::•()
+    ;
+}
+abstract class PointerSignalEvent extends self::PointerEvent {
+  synthetic constructor •() → self::PointerSignalEvent
+    : super self::PointerEvent::•()
+    ;
+}
+abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/  {
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
+  }
+}
+abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/  {
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
+    : super self::PointerSignalEvent::•()
+    ;
+  mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
+    return super.{self::_PointerEventDescription::debugFillProperties}(properties);
+}
+abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
+    ;
+}
+class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
+  synthetic constructor •() → self::PointerScrollEvent
+    : super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
+    ;
+  @#C1
+  method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
+    super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
+  }
+}
+static method main() → dynamic {
+  new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 2d00cd0..d84d3b9 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -181,6 +181,7 @@
 none/operator: TypeCheckError
 none/property_get: TypeCheckError
 none/property_set: TypeCheckError
+none/mixin_super: TextSerializationFailure
 none/tearoff_opt_out: TextSerializationFailure
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
diff --git a/tests/modular/mixin_super/main.dart b/tests/modular/mixin_super/main.dart
new file mode 100644
index 0000000..5b90234
--- /dev/null
+++ b/tests/modular/mixin_super/main.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.md file.
+
+mixin Diagnosticable {
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
+}
+
+class DiagnosticPropertiesBuilder {}
+
+abstract class PointerEvent with Diagnosticable {}
+
+abstract class PointerSignalEvent extends PointerEvent {}
+
+mixin _PointerEventDescription on PointerEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+mixin _CopyPointerScrollEvent on PointerEvent {}
+
+class PointerScrollEvent extends PointerSignalEvent
+    with _PointerEventDescription, _CopyPointerScrollEvent {
+  @override
+  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
+    super.debugFillProperties(properties);
+  }
+}
+
+main() {
+  new PointerScrollEvent()
+      .debugFillProperties(new DiagnosticPropertiesBuilder());
+}
diff --git a/tests/modular/mixin_super/modules.yaml b/tests/modular/mixin_super/modules.yaml
new file mode 100644
index 0000000..7313554
--- /dev/null
+++ b/tests/modular/mixin_super/modules.yaml
@@ -0,0 +1,6 @@
+# Copyright (c) 2021, 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.
+
+dependencies:
+  main: []