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