Version 2.15.0-255.0.dev

Merge commit '1972c11b4e973f621d47c98e67944be2ff408b2a' into 'dev'
diff --git a/DEPS b/DEPS
index a04e778..2334d93 100644
--- a/DEPS
+++ b/DEPS
@@ -44,7 +44,7 @@
   # co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
   # hashes. It requires access to the dart-build-access group, which EngProd
   # has.
-  "co19_rev": "cd6510c8346444792b37f6f26feffcc234a44dd1",
+  "co19_rev": "73545b2bf6c7f8e4eb931bb04d86e38d6485deee",
   # This line prevents conflicts when both packages are rolled simultaneously.
   "co19_2_rev": "a93f8484f7265f0849692d3b1208323393733f8d",
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 073c5da..0b96e08 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -5059,6 +5059,19 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeImplicitSuperCallOfNonMethod =
+    messageImplicitSuperCallOfNonMethod;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageImplicitSuperCallOfNonMethod = const MessageCode(
+    "ImplicitSuperCallOfNonMethod",
+    analyzerCodes: <String>["IMPLICIT_CALL_OF_NON_METHOD"],
+    problemMessage:
+        r"""Cannot invoke `super` because it declares 'call' to be something other than a method.""",
+    correctionMessage:
+        r"""Try changing 'call' to a method or explicitly invoke 'call'.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeImportAfterPart = messageImportAfterPart;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 4b2244d..b13e27c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6980,9 +6980,7 @@
   @override
   Expression buildMethodInvocation(
       Expression receiver, Name name, Arguments arguments, int offset,
-      {bool isConstantExpression: false,
-      bool isNullAware: false,
-      bool isSuper: false}) {
+      {bool isConstantExpression: false, bool isNullAware: false}) {
     if (constantContext != ConstantContext.none &&
         !isConstantExpression &&
         !enableConstFunctionsInLibrary) {
@@ -6992,31 +6990,6 @@
           offset,
           name.text.length);
     }
-    if (isSuper) {
-      // We can ignore [isNullAware] on super sends.
-      assert(forest.isThisExpression(receiver));
-      Member? target = lookupInstanceMember(name, isSuper: true);
-
-      if (target == null || (target is Procedure && !target.isAccessor)) {
-        if (target == null) {
-          warnUnresolvedMethod(name, offset, isSuper: true);
-        } else if (!areArgumentsCompatible(target.function!, arguments)) {
-          target = null;
-          addProblemErrorIfConst(
-              fasta.templateSuperclassMethodArgumentMismatch
-                  .withArguments(name.text),
-              offset,
-              name.text.length);
-        }
-        return new SuperMethodInvocation(name, arguments, target as Procedure?)
-          ..fileOffset = offset;
-      }
-
-      receiver = new SuperPropertyGet(name, target)..fileOffset = offset;
-      return forest.createExpressionInvocation(
-          arguments.fileOffset, receiver, arguments);
-    }
-
     if (isNullAware) {
       VariableDeclarationImpl variable =
           createVariableDeclarationForValue(receiver);
@@ -7034,6 +7007,47 @@
   }
 
   @override
+  Expression buildSuperInvocation(Name name, Arguments arguments, int offset,
+      {bool isConstantExpression: false,
+      bool isNullAware: false,
+      bool isImplicitCall: false}) {
+    if (constantContext != ConstantContext.none &&
+        !isConstantExpression &&
+        !enableConstFunctionsInLibrary) {
+      return buildProblem(
+          fasta.templateNotConstantExpression
+              .withArguments('Method invocation'),
+          offset,
+          name.text.length);
+    }
+    Member? target = lookupInstanceMember(name, isSuper: true);
+
+    if (target == null || (target is Procedure && !target.isAccessor)) {
+      if (target == null) {
+        warnUnresolvedMethod(name, offset, isSuper: true);
+      } else if (!areArgumentsCompatible(target.function!, arguments)) {
+        target = null;
+        addProblemErrorIfConst(
+            fasta.templateSuperclassMethodArgumentMismatch
+                .withArguments(name.text),
+            offset,
+            name.text.length);
+      }
+      return new SuperMethodInvocation(name, arguments, target as Procedure?)
+        ..fileOffset = offset;
+    }
+    if (isImplicitCall) {
+      return buildProblem(
+          fasta.messageImplicitSuperCallOfNonMethod, offset, noLength);
+    } else {
+      Expression receiver = new SuperPropertyGet(name, target)
+        ..fileOffset = offset;
+      return forest.createExpressionInvocation(
+          arguments.fileOffset, receiver, arguments);
+    }
+  }
+
+  @override
   void addProblem(Message message, int charOffset, int length,
       {bool wasHandled: false,
       List<LocatedMessage>? context,
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
index 9347efa..ff0fb53 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -4480,12 +4480,16 @@
       if (isNullAware) {
         _reportNonNullableInNullAwareWarningIfNeeded();
       }
-      return _helper.buildMethodInvocation(
-          _forest.createThisExpression(fileOffset),
-          name,
-          selector.arguments,
-          offsetForToken(selector.token),
-          isSuper: isSuper);
+      if (isSuper) {
+        return _helper.buildSuperInvocation(
+            name, selector.arguments, offsetForToken(selector.token));
+      } else {
+        return _helper.buildMethodInvocation(
+            _forest.createThisExpression(fileOffset),
+            name,
+            selector.arguments,
+            offsetForToken(selector.token));
+      }
     } else {
       if (isSuper) {
         Member? getter = _helper.lookupInstanceMember(name, isSuper: isSuper);
@@ -4517,7 +4521,8 @@
     if (isInitializer) {
       return buildConstructorInitializer(offset, new Name(""), arguments);
     } else if (isSuper) {
-      return _helper.buildProblem(messageSuperAsExpression, offset, noLength);
+      return _helper.buildSuperInvocation(Name.callName, arguments, offset,
+          isImplicitCall: true);
     } else {
       return _helper.forest.createExpressionInvocation(
           offset, _forest.createThisExpression(fileOffset), arguments);
@@ -4531,12 +4536,8 @@
     assert(isNot != null);
     if (isSuper) {
       int offset = offsetForToken(token);
-      Expression result = _helper.buildMethodInvocation(
-          _forest.createThisExpression(fileOffset),
-          equalsName,
-          _forest.createArguments(offset, <Expression>[right]),
-          offset,
-          isSuper: true);
+      Expression result = _helper.buildSuperInvocation(equalsName,
+          _forest.createArguments(offset, <Expression>[right]), offset);
       if (isNot) {
         result = _forest.createNot(offset, result);
       }
@@ -4550,12 +4551,8 @@
       Token token, Name binaryName, Expression right) {
     if (isSuper) {
       int offset = offsetForToken(token);
-      return _helper.buildMethodInvocation(
-          _forest.createThisExpression(fileOffset),
-          binaryName,
-          _forest.createArguments(offset, <Expression>[right]),
-          offset,
-          isSuper: true);
+      return _helper.buildSuperInvocation(binaryName,
+          _forest.createArguments(offset, <Expression>[right]), offset);
     }
     return super.buildBinaryOperation(token, binaryName, right);
   }
@@ -4564,12 +4561,8 @@
   Expression_Generator buildUnaryOperation(Token token, Name unaryName) {
     if (isSuper) {
       int offset = offsetForToken(token);
-      return _helper.buildMethodInvocation(
-          _forest.createThisExpression(fileOffset),
-          unaryName,
-          _forest.createArgumentsEmpty(offset),
-          offset,
-          isSuper: true);
+      return _helper.buildSuperInvocation(
+          unaryName, _forest.createArgumentsEmpty(offset), offset);
     }
     return super.buildUnaryOperation(token, unaryName);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 3d52030..42258ae 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -114,9 +114,12 @@
 
   Expression buildMethodInvocation(
       Expression receiver, Name name, Arguments arguments, int offset,
+      {bool isConstantExpression: false, bool isNullAware: false});
+
+  Expression buildSuperInvocation(Name name, Arguments arguments, int offset,
       {bool isConstantExpression: false,
       bool isNullAware: false,
-      bool isSuper: false});
+      bool isImplicitCall: false});
 
   Expression buildConstructorInvocation(
       TypeDeclarationBuilder type,
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 308d0a6..b217478 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -422,7 +422,6 @@
 ImplementsNever/example: Fail # Feature not yet enabled by default.
 ImplementsVoid/analyzerCode: Fail # Feature not yet in analyzer.
 ImplementsVoid/example: Fail # Feature not yet enabled by default.
-ImplicitCallOfNonMethod/example: Fail
 ImplicitMixinOverride/analyzerCode: Fail
 ImplicitMixinOverride/example: Fail
 ImplicitReturnNull/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 3ab4a3e..0ef4650 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -3922,6 +3922,17 @@
   problemMessage: "Cannot invoke an instance of '#type' because it declares 'call' to be something other than a method."
   correctionMessage: "Try changing 'call' to a method or explicitly invoke 'call'."
   analyzerCode: IMPLICIT_CALL_OF_NON_METHOD
+  script: |
+    class Class { void Function() get call => () {}; }
+    method(Class c) => c();
+
+ImplicitSuperCallOfNonMethod:
+  problemMessage: "Cannot invoke `super` because it declares 'call' to be something other than a method."
+  correctionMessage: "Try changing 'call' to a method or explicitly invoke 'call'."
+  analyzerCode: IMPLICIT_CALL_OF_NON_METHOD
+  script: |
+    class Super { void Function() get call => () {}; }
+    class Class extends Super { void method() => super(); }
 
 ExpectedOneExpression:
   problemMessage: "Expected one expression, but found additional input."
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart b/pkg/front_end/testcases/general/implicit_super_call.dart
new file mode 100644
index 0000000..5615742
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart
@@ -0,0 +1,116 @@
+// 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.
+
+class Super1 {
+  void call() {}
+}
+
+class Class1 extends Super1 {
+  void method() {
+    super();
+    super.call();
+  }
+}
+
+class Super2 {
+  int call(int a, [int? b]) => a;
+}
+
+class Class2 extends Super2 {
+  void method() {
+    super(0);
+    super(0, 1);
+    super.call(0);
+    super.call(0, 1);
+  }
+}
+
+class Super3 {
+  int call(int a, {int? b, int? c}) => a;
+}
+
+class Class3 extends Super3 {
+  void method() {
+    super(0);
+    super(0, b: 1);
+    super(0, c: 1);
+    super(0, b: 1, c: 2);
+    super(0, c: 1, b: 2);
+    super.call(0);
+    super.call(0, b: 1);
+    super.call(0, c: 1);
+    super.call(0, b: 1, c: 2);
+    super.call(0, c: 1, b: 2);
+  }
+}
+
+class Super4 {
+  T call<T>(T a) => a;
+}
+
+class Class4 extends Super4 {
+  void method() {
+    super(0);
+    super<int>(0);
+    super.call(0);
+    super.call<int>(0);
+  }
+}
+
+class Super5 {
+  int Function(int) get call => (int a) => a;
+}
+
+class Class5 extends Super5 {
+  void test() {
+    super(0); // error
+  }
+
+  void method() {
+    super.call(0); // ok
+  }
+}
+
+class Super6 {
+  int Function(int) call = (int a) => a;
+}
+
+class Class6 extends Super6 {
+  void test() {
+    super(0); // error
+  }
+
+  void method() {
+    super.call(0); // ok
+  }
+}
+
+class Super7 {
+  void set call(int Function(int) value) {}
+}
+
+class Class7 extends Super7 {
+  void test() {
+    super(0); // error
+    super.call(0); // error
+  }
+}
+
+class Super8 {}
+
+class Class8 extends Super8 {
+  void test() {
+    super(); // error
+    super.call(); // error
+  }
+}
+
+main() {
+  new Class1().method();
+  new Class2().method();
+  new Class3().method();
+  new Class4().method();
+  new Class5().method();
+  new Class6().method();
+}
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart.textual_outline.expect b/pkg/front_end/testcases/general/implicit_super_call.dart.textual_outline.expect
new file mode 100644
index 0000000..e6e9f87
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart.textual_outline.expect
@@ -0,0 +1,65 @@
+class Super1 {
+  void call() {}
+}
+
+class Class1 extends Super1 {
+  void method() {}
+}
+
+class Super2 {
+  int call(int a, [int? b]) => a;
+}
+
+class Class2 extends Super2 {
+  void method() {}
+}
+
+class Super3 {
+  int call(int a, {int? b, int? c}) => a;
+}
+
+class Class3 extends Super3 {
+  void method() {}
+}
+
+class Super4 {
+  T call<T>(T a) => a;
+}
+
+class Class4 extends Super4 {
+  void method() {}
+}
+
+class Super5 {
+  int Function(int) get call => (int a) => a;
+}
+
+class Class5 extends Super5 {
+  void test() {}
+  void method() {}
+}
+
+class Super6 {
+  int Function(int) call = (int a) => a;
+}
+
+class Class6 extends Super6 {
+  void test() {}
+  void method() {}
+}
+
+class Super7 {
+  void set call(int Function(int) value) {}
+}
+
+class Class7 extends Super7 {
+  void test() {}
+}
+
+class Super8 {}
+
+class Class8 extends Super8 {
+  void test() {}
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/implicit_super_call.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4cb5718
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart.textual_outline_modelled.expect
@@ -0,0 +1,65 @@
+class Class1 extends Super1 {
+  void method() {}
+}
+
+class Class2 extends Super2 {
+  void method() {}
+}
+
+class Class3 extends Super3 {
+  void method() {}
+}
+
+class Class4 extends Super4 {
+  void method() {}
+}
+
+class Class5 extends Super5 {
+  void method() {}
+  void test() {}
+}
+
+class Class6 extends Super6 {
+  void method() {}
+  void test() {}
+}
+
+class Class7 extends Super7 {
+  void test() {}
+}
+
+class Class8 extends Super8 {
+  void test() {}
+}
+
+class Super1 {
+  void call() {}
+}
+
+class Super2 {
+  int call(int a, [int? b]) => a;
+}
+
+class Super3 {
+  int call(int a, {int? b, int? c}) => a;
+}
+
+class Super4 {
+  T call<T>(T a) => a;
+}
+
+class Super5 {
+  int Function(int) get call => (int a) => a;
+}
+
+class Super6 {
+  int Function(int) call = (int a) => a;
+}
+
+class Super7 {
+  void set call(int Function(int) value) {}
+}
+
+class Super8 {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart.weak.expect b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.expect
new file mode 100644
index 0000000..f6e3ccb
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.expect
@@ -0,0 +1,190 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:67:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//     super(0); // error
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:81:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+// Try changing 'call' to a method or explicitly invoke 'call'.
+//     super(0); // error
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:95:5: Error: Superclass has no method named 'call'.
+//     super(0); // error
+//     ^^^^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:96:11: Error: Superclass has no method named 'call'.
+//     super.call(0); // error
+//           ^^^^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:104:5: Error: Superclass has no method named 'call'.
+//     super(); // error
+//     ^^^^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:105:11: Error: Superclass has no method named 'call'.
+//     super.call(); // error
+//           ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    : super core::Object::•()
+    ;
+  method call() → void {}
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    : super self::Super1::•()
+    ;
+  method method() → void {
+    super.{self::Super1::call}();
+    super.{self::Super1::call}();
+  }
+}
+class Super2 extends core::Object {
+  synthetic constructor •() → self::Super2
+    : super core::Object::•()
+    ;
+  method call(core::int a, [core::int? b = #C1]) → core::int
+    return a;
+}
+class Class2 extends self::Super2 {
+  synthetic constructor •() → self::Class2
+    : super self::Super2::•()
+    ;
+  method method() → void {
+    super.{self::Super2::call}(0);
+    super.{self::Super2::call}(0, 1);
+    super.{self::Super2::call}(0);
+    super.{self::Super2::call}(0, 1);
+  }
+}
+class Super3 extends core::Object {
+  synthetic constructor •() → self::Super3
+    : super core::Object::•()
+    ;
+  method call(core::int a, {core::int? b = #C1, core::int? c = #C1}) → core::int
+    return a;
+}
+class Class3 extends self::Super3 {
+  synthetic constructor •() → self::Class3
+    : super self::Super3::•()
+    ;
+  method method() → void {
+    super.{self::Super3::call}(0);
+    super.{self::Super3::call}(0, b: 1);
+    super.{self::Super3::call}(0, c: 1);
+    super.{self::Super3::call}(0, b: 1, c: 2);
+    super.{self::Super3::call}(0, c: 1, b: 2);
+    super.{self::Super3::call}(0);
+    super.{self::Super3::call}(0, b: 1);
+    super.{self::Super3::call}(0, c: 1);
+    super.{self::Super3::call}(0, b: 1, c: 2);
+    super.{self::Super3::call}(0, c: 1, b: 2);
+  }
+}
+class Super4 extends core::Object {
+  synthetic constructor •() → self::Super4
+    : super core::Object::•()
+    ;
+  method call<T extends core::Object? = dynamic>(self::Super4::call::T% a) → self::Super4::call::T%
+    return a;
+}
+class Class4 extends self::Super4 {
+  synthetic constructor •() → self::Class4
+    : super self::Super4::•()
+    ;
+  method method() → void {
+    super.{self::Super4::call}<core::int>(0);
+    super.{self::Super4::call}<core::int>(0);
+    super.{self::Super4::call}<core::int>(0);
+    super.{self::Super4::call}<core::int>(0);
+  }
+}
+class Super5 extends core::Object {
+  synthetic constructor •() → self::Super5
+    : super core::Object::•()
+    ;
+  get call() → (core::int) → core::int
+    return (core::int a) → core::int => a;
+}
+class Class5 extends self::Super5 {
+  synthetic constructor •() → self::Class5
+    : super self::Super5::•()
+    ;
+  method test() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:67:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+Try changing 'call' to a method or explicitly invoke 'call'.
+    super(0); // error
+    ^";
+  }
+  method method() → void {
+    super.{self::Super5::call}(0){(core::int) → core::int};
+  }
+}
+class Super6 extends core::Object {
+  field (core::int) → core::int call = (core::int a) → core::int => a;
+  synthetic constructor •() → self::Super6
+    : super core::Object::•()
+    ;
+}
+class Class6 extends self::Super6 {
+  synthetic constructor •() → self::Class6
+    : super self::Super6::•()
+    ;
+  method test() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:81:5: Error: Cannot invoke `super` because it declares 'call' to be something other than a method.
+Try changing 'call' to a method or explicitly invoke 'call'.
+    super(0); // error
+    ^";
+  }
+  method method() → void {
+    super.{self::Super6::call}(0){(core::int) → core::int};
+  }
+}
+class Super7 extends core::Object {
+  synthetic constructor •() → self::Super7
+    : super core::Object::•()
+    ;
+  set call((core::int) → core::int value) → void {}
+}
+class Class7 extends self::Super7 {
+  synthetic constructor •() → self::Class7
+    : super self::Super7::•()
+    ;
+  method test() → void {
+    super.call(0);
+    super.call(0);
+  }
+}
+class Super8 extends core::Object {
+  synthetic constructor •() → self::Super8
+    : super core::Object::•()
+    ;
+}
+class Class8 extends self::Super8 {
+  synthetic constructor •() → self::Class8
+    : super self::Super8::•()
+    ;
+  method test() → void {
+    super.call();
+    super.call();
+  }
+}
+static method main() → dynamic {
+  new self::Class1::•().{self::Class1::method}(){() → void};
+  new self::Class2::•().{self::Class2::method}(){() → void};
+  new self::Class3::•().{self::Class3::method}(){() → void};
+  new self::Class4::•().{self::Class4::method}(){() → void};
+  new self::Class5::•().{self::Class5::method}(){() → void};
+  new self::Class6::•().{self::Class6::method}(){() → void};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart.weak.outline.expect b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.outline.expect
new file mode 100644
index 0000000..3f03f7a
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.outline.expect
@@ -0,0 +1,103 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    ;
+  method call() → void
+    ;
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    ;
+  method method() → void
+    ;
+}
+class Super2 extends core::Object {
+  synthetic constructor •() → self::Super2
+    ;
+  method call(core::int a, [core::int? b]) → core::int
+    ;
+}
+class Class2 extends self::Super2 {
+  synthetic constructor •() → self::Class2
+    ;
+  method method() → void
+    ;
+}
+class Super3 extends core::Object {
+  synthetic constructor •() → self::Super3
+    ;
+  method call(core::int a, {core::int? b, core::int? c}) → core::int
+    ;
+}
+class Class3 extends self::Super3 {
+  synthetic constructor •() → self::Class3
+    ;
+  method method() → void
+    ;
+}
+class Super4 extends core::Object {
+  synthetic constructor •() → self::Super4
+    ;
+  method call<T extends core::Object? = dynamic>(self::Super4::call::T% a) → self::Super4::call::T%
+    ;
+}
+class Class4 extends self::Super4 {
+  synthetic constructor •() → self::Class4
+    ;
+  method method() → void
+    ;
+}
+class Super5 extends core::Object {
+  synthetic constructor •() → self::Super5
+    ;
+  get call() → (core::int) → core::int
+    ;
+}
+class Class5 extends self::Super5 {
+  synthetic constructor •() → self::Class5
+    ;
+  method test() → void
+    ;
+  method method() → void
+    ;
+}
+class Super6 extends core::Object {
+  field (core::int) → core::int call;
+  synthetic constructor •() → self::Super6
+    ;
+}
+class Class6 extends self::Super6 {
+  synthetic constructor •() → self::Class6
+    ;
+  method test() → void
+    ;
+  method method() → void
+    ;
+}
+class Super7 extends core::Object {
+  synthetic constructor •() → self::Super7
+    ;
+  set call((core::int) → core::int value) → void
+    ;
+}
+class Class7 extends self::Super7 {
+  synthetic constructor •() → self::Class7
+    ;
+  method test() → void
+    ;
+}
+class Super8 extends core::Object {
+  synthetic constructor •() → self::Super8
+    ;
+}
+class Class8 extends self::Super8 {
+  synthetic constructor •() → self::Class8
+    ;
+  method test() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/implicit_super_call.dart.weak.transformed.expect b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.transformed.expect
new file mode 100644
index 0000000..b81cdfd
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_super_call.dart.weak.transformed.expect
@@ -0,0 +1,137 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:11:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super();
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:22:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0);
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:23:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0, 1);
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:35:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0);
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:36:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0, b: 1);
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:37:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0, c: 1);
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:38:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0, b: 1, c: 2);
+//     ^
+//
+// pkg/front_end/testcases/general/implicit_super_call.dart:39:5: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     super(0, c: 1, b: 2);
+//     ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Super1 extends core::Object {
+  synthetic constructor •() → self::Super1
+    : super core::Object::•()
+    ;
+  method call() → void {}
+}
+class Class1 extends self::Super1 {
+  synthetic constructor •() → self::Class1
+    : super self::Super1::•()
+    ;
+  method method() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:11:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super();
+    ^";
+    super.{self::Super1::call}();
+  }
+}
+class Super2 extends core::Object {
+  synthetic constructor •() → self::Super2
+    : super core::Object::•()
+    ;
+  method call(core::int a, [core::int? b = #C1]) → core::int
+    return a;
+}
+class Class2 extends self::Super2 {
+  synthetic constructor •() → self::Class2
+    : super self::Super2::•()
+    ;
+  method method() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:22:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0);
+    ^";
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:23:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0, 1);
+    ^";
+    super.{self::Super2::call}(0);
+    super.{self::Super2::call}(0, 1);
+  }
+}
+class Super3 extends core::Object {
+  synthetic constructor •() → self::Super3
+    : super core::Object::•()
+    ;
+  method call(core::int a, {core::int? b = #C1, core::int? c = #C1}) → core::int
+    return a;
+}
+class Class3 extends self::Super3 {
+  synthetic constructor •() → self::Class3
+    : super self::Super3::•()
+    ;
+  method method() → void {
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:35:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0);
+    ^";
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:36:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0, b: 1);
+    ^";
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:37:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0, c: 1);
+    ^";
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:38:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0, b: 1, c: 2);
+    ^";
+    invalid-expression "pkg/front_end/testcases/general/implicit_super_call.dart:39:5: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    super(0, c: 1, b: 2);
+    ^";
+    super.{self::Super3::call}(0);
+    super.{self::Super3::call}(0, b: 1);
+    super.{self::Super3::call}(0, c: 1);
+    super.{self::Super3::call}(0, b: 1, c: 2);
+    super.{self::Super3::call}(0, c: 1, b: 2);
+  }
+}
+static method main() → dynamic {
+  new self::Class1::•().{self::Class1::method}(){() → void};
+  new self::Class2::•().{self::Class2::method}(){() → void};
+  new self::Class3::•().{self::Class3::method}(){() → void};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/implicit_this.dart b/pkg/front_end/testcases/general/implicit_this.dart
index 8acf692..289b962 100644
--- a/pkg/front_end/testcases/general/implicit_this.dart
+++ b/pkg/front_end/testcases/general/implicit_this.dart
@@ -1,7 +1,9 @@
 // Copyright (c) 2016, 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.
+
 // @dart=2.9
+
 class C {
   m() {
     print("Called m");
diff --git a/pkg/front_end/testcases/general/super_call.dart b/pkg/front_end/testcases/general/super_call.dart
index 33cb6ae..0ba2666 100644
--- a/pkg/front_end/testcases/general/super_call.dart
+++ b/pkg/front_end/testcases/general/super_call.dart
@@ -12,8 +12,7 @@
   int call(int x) => x * 3;
 
   int call_super() {
-    // Assumes that super() means super.call().
-    // In reality, it is illegal to use it this way.
+    // super() means super.call().
     return super(5);
   }
 }
diff --git a/pkg/front_end/testcases/general/super_call.dart.weak.expect b/pkg/front_end/testcases/general/super_call.dart.weak.expect
index 6c726a4..1e7e27c 100644
--- a/pkg/front_end/testcases/general/super_call.dart.weak.expect
+++ b/pkg/front_end/testcases/general/super_call.dart.weak.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/general/super_call.dart:17:12: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     return super(5);
-//            ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -34,10 +26,7 @@
   method call(core::int* x) → core::int*
     return x.{core::num::*}(3){(core::num*) →* core::int*};
   method call_super() → core::int* {
-    return invalid-expression "pkg/front_end/testcases/general/super_call.dart:17:12: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    return super(5);
-           ^";
+    return super.{self::A::call}(5);
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/general/super_call.dart.weak.transformed.expect b/pkg/front_end/testcases/general/super_call.dart.weak.transformed.expect
index 6c726a4..1e7e27c 100644
--- a/pkg/front_end/testcases/general/super_call.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/super_call.dart.weak.transformed.expect
@@ -1,12 +1,4 @@
 library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/general/super_call.dart:17:12: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     return super(5);
-//            ^
-//
 import self as self;
 import "dart:core" as core;
 
@@ -34,10 +26,7 @@
   method call(core::int* x) → core::int*
     return x.{core::num::*}(3){(core::num*) →* core::int*};
   method call_super() → core::int* {
-    return invalid-expression "pkg/front_end/testcases/general/super_call.dart:17:12: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    return super(5);
-           ^";
+    return super.{self::A::call}(5);
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index f9b4d6d..9306978 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -76,6 +76,7 @@
 general/getter_vs_setter_type: TypeCheckError
 general/incomplete_field_formal_parameter: RuntimeError
 general/infer_field_from_multiple: TypeCheckError
+general/implicit_super_call: TypeCheckError
 general/implement_semi_stub: TypeCheckError
 general/invalid_operator: TypeCheckError
 general/invalid_operator_override: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 5b1bdb6..3b2aaee 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -79,6 +79,7 @@
 general/expressions: RuntimeError
 general/getter_vs_setter_type: TypeCheckError
 general/implement_semi_stub: TypeCheckError
+general/implicit_super_call: TypeCheckError
 general/incomplete_field_formal_parameter: RuntimeError
 general/infer_field_from_multiple: TypeCheckError
 general/invalid_operator: TypeCheckError
diff --git a/tools/VERSION b/tools/VERSION
index 9ab1341..15bdd8c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 254
+PRERELEASE 255
 PRERELEASE_PATCH 0
\ No newline at end of file