[cfe] Add some of the compile-time errors for super parameters
Part of https://github.com/dart-lang/sdk/issues/47525
Change-Id: Ic0ad44656f6b5f6fa56f8c130e3e44b8729a9659
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/223160
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
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 ece4718..e7890ff 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -1049,51 +1049,74 @@
];
}
- if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
- List<VariableDeclaration>? positionalSuperParameters;
- List<VariableDeclaration>? namedSuperParameters;
-
- List<FormalParameterBuilder>? formals =
- (member as ConstructorBuilder).formals;
- if (formals != null) {
- for (FormalParameterBuilder formal in formals) {
- if (formal.isSuperInitializingFormal) {
- if (formal.isNamed) {
- (namedSuperParameters ??= <VariableDeclaration>[])
- .add(formal.variable!);
- } else {
- (positionalSuperParameters ??= <VariableDeclaration>[])
- .add(formal.variable!);
- }
- }
- }
-
+ if (libraryBuilder.enableSuperParametersInLibrary) {
+ if (initializers.isNotEmpty && initializers.last is SuperInitializer) {
SuperInitializer superInitializer =
initializers.last as SuperInitializer;
Arguments arguments = superInitializer.arguments;
- if (positionalSuperParameters != null) {
- if (arguments.positional.isNotEmpty) {
- addProblem(fasta.messagePositionalSuperParametersAndArguments,
- arguments.fileOffset, noLength,
- context: <LocatedMessage>[
- fasta.messageSuperInitializerParameter.withLocation(
- uri, positionalSuperParameters.first.fileOffset, noLength)
- ]);
- } else {
- for (VariableDeclaration positional in positionalSuperParameters) {
- arguments.positional.add(
- new VariableGetImpl(positional, forNullGuardedAccess: false)
- ..fileOffset = positional.fileOffset);
+
+ List<VariableDeclaration>? positionalSuperParameters;
+ List<VariableDeclaration>? namedSuperParameters;
+
+ List<FormalParameterBuilder>? formals =
+ (member as ConstructorBuilder).formals;
+ if (formals != null) {
+ for (FormalParameterBuilder formal in formals) {
+ if (formal.isSuperInitializingFormal) {
+ if (formal.isNamed) {
+ (namedSuperParameters ??= <VariableDeclaration>[])
+ .add(formal.variable!);
+ } else {
+ (positionalSuperParameters ??= <VariableDeclaration>[])
+ .add(formal.variable!);
+ }
+ }
+ }
+
+ if (positionalSuperParameters != null) {
+ if (arguments.positional.isNotEmpty) {
+ addProblem(fasta.messagePositionalSuperParametersAndArguments,
+ arguments.fileOffset, noLength,
+ context: <LocatedMessage>[
+ fasta.messageSuperInitializerParameter.withLocation(uri,
+ positionalSuperParameters.first.fileOffset, noLength)
+ ]);
+ } else {
+ for (VariableDeclaration positional
+ in positionalSuperParameters) {
+ arguments.positional.add(
+ new VariableGetImpl(positional, forNullGuardedAccess: false)
+ ..fileOffset = positional.fileOffset);
+ }
+ }
+ }
+ if (namedSuperParameters != null) {
+ // TODO(cstefantsova): Report name conflicts.
+ for (VariableDeclaration named in namedSuperParameters) {
+ arguments.named.add(new NamedExpression(
+ named.name!,
+ new VariableGetImpl(named, forNullGuardedAccess: false)
+ ..fileOffset = named.fileOffset)
+ ..fileOffset = named.fileOffset);
}
}
}
- if (namedSuperParameters != null) {
- // TODO(cstefantsova): Report name conflicts.
- for (VariableDeclaration named in namedSuperParameters) {
- arguments.named.add(new NamedExpression(named.name!,
- new VariableGetImpl(named, forNullGuardedAccess: false))
- ..fileOffset = named.fileOffset);
- }
+
+ LocatedMessage? message = checkArgumentsForFunction(
+ superInitializer.target.function,
+ arguments,
+ arguments.fileOffset, <TypeParameter>[]);
+ if (message != null) {
+ initializers[initializers.length - 1] = buildInvalidInitializer(
+ buildUnresolvedError(
+ forest.createNullLiteral(superInitializer.fileOffset),
+ constructorNameForDiagnostics(
+ superInitializer.target.name.text),
+ arguments,
+ superInitializer.fileOffset,
+ isSuper: true,
+ message: message,
+ kind: UnresolvedKind.Constructor));
}
}
}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart
new file mode 100644
index 0000000..bd5cc28
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart
@@ -0,0 +1,33 @@
+// 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 A1 {
+ final int foo;
+ A1({required this.foo});
+}
+
+class B1 extends A1 {
+ B1({required super.foo}) : super(); // Ok.
+}
+
+class C1 extends A1 {
+ C1({required super.foo}) : super(foo: foo); // Error.
+}
+
+class A2 {
+ final int foo;
+ final String bar;
+ A2({required this.foo, required this.bar});
+}
+
+class B2 extends A2 {
+ B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+}
+
+class C2 extends A2 {
+ C2({required super.foo}) : super(); // Error.
+ C2.other({required super.foo}) : super(bar: 'bar'); // Ok.
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+// C1({required super.foo}) : super(foo: foo); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+// C2({required super.foo}) : super(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class C1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::C1
+ : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+ C1({required super.foo}) : super(foo: foo); // Error.
+ ^^^" in block {
+ foo;
+ } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+ B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+ ^^^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •({required dynamic foo = #C1}) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+ C2({required super.foo}) : super(); // Error.
+ ^"
+ ;
+ constructor other({required dynamic foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..74cac10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.strong.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+// C1({required super.foo}) : super(foo: foo); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+// C2({required super.foo}) : super(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class C1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::C1
+ : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+ C1({required super.foo}) : super(foo: foo); // Error.
+ ^^^" in block {
+ foo;
+ } =>foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+ B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+ ^^^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •({required dynamic foo = #C1}) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+ C2({required super.foo}) : super(); // Error.
+ ^"
+ ;
+ constructor other({required dynamic foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect
new file mode 100644
index 0000000..3c4243b
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.textual_outline.expect
@@ -0,0 +1,23 @@
+class A1 {
+ final int foo;
+ A1({required this.foo});
+}
+class B1 extends A1 {
+ B1({required super.foo}) : super();
+}
+class C1 extends A1 {
+ C1({required super.foo}) : super(foo: foo);
+}
+class A2 {
+ final int foo;
+ final String bar;
+ A2({required this.foo, required this.bar});
+}
+class B2 extends A2 {
+ B2() : super(foo: 42, bar: "bar", baz: false);
+}
+class C2 extends A2 {
+ C2({required super.foo}) : super();
+ C2.other({required super.foo}) : super(bar: 'bar');
+}
+main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+// C1({required super.foo}) : super(foo: foo); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+// C2({required super.foo}) : super(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class C1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::C1
+ : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+ C1({required super.foo}) : super(foo: foo); // Error.
+ ^^^" in block {
+ foo;
+ } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+ B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+ ^^^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •({required dynamic foo = #C1}) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+ C2({required super.foo}) : super(); // Error.
+ ^"
+ ;
+ constructor other({required dynamic foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
new file mode 100644
index 0000000..01051cd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.modular.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+// C1({required super.foo}) : super(foo: foo); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+// C2({required super.foo}) : super(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class C1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::C1
+ : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+ C1({required super.foo}) : super(foo: foo); // Error.
+ ^^^" in block {
+ foo;
+ } =>foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+ B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+ ^^^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •({required dynamic foo = #C1}) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+ C2({required super.foo}) : super(); // Error.
+ ^"
+ ;
+ constructor other({required dynamic foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
new file mode 100644
index 0000000..f3d5bdd
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.outline.expect
@@ -0,0 +1,35 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •({required core::int foo}) → self::A1
+ ;
+}
+class B1 extends self::A1 {
+ constructor •({required dynamic foo}) → self::B1
+ ;
+}
+class C1 extends self::A1 {
+ constructor •({required dynamic foo}) → self::C1
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo, required core::String bar}) → self::A2
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ ;
+}
+class C2 extends self::A2 {
+ constructor •({required dynamic foo}) → self::C2
+ ;
+ constructor other({required dynamic foo}) → self::C2
+ ;
+}
+static method main() → dynamic
+ ;
diff --git a/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
new file mode 100644
index 0000000..74cac10
--- /dev/null
+++ b/pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart.weak.transformed.expect
@@ -0,0 +1,68 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+// C1({required super.foo}) : super(foo: foo); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+// B2() : super(foo: 42, bar: "bar", baz: false); // Error.
+// ^^^
+//
+// pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+// C2({required super.foo}) : super(); // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+ final field core::int foo;
+ constructor •({required core::int foo = #C1}) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
+ ;
+}
+class B1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::B1
+ : super self::A1::•(foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+class C1 extends self::A1 {
+ constructor •({required dynamic foo = #C1}) → self::C1
+ : super self::A1::•(foo: invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:15:22: Error: Duplicated named argument 'foo'.
+ C1({required super.foo}) : super(foo: foo); // Error.
+ ^^^" in block {
+ foo;
+ } =>foo)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •({required core::int foo = #C1, required core::String bar = #C1}) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:25:37: Error: No named parameter with the name 'baz'.
+ B2() : super(foo: 42, bar: \"bar\", baz: false); // Error.
+ ^^^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •({required dynamic foo = #C1}) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_named_super_parameters.dart:29:35: Error: Required named parameter 'bar' must be provided.
+ C2({required super.foo}) : super(); // Error.
+ ^"
+ ;
+ constructor other({required dynamic foo = #C1}) → self::C2
+ : super self::A2::•(bar: "bar", foo: foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+ ;
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
index f8bb940..d34d4a6 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart
@@ -2,17 +2,31 @@
// 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 A {
+class A1 {
final int foo;
- A(this.foo);
+ A1(this.foo);
}
-class B extends A {
- B(super.foo) : super();
+class B1 extends A1 {
+ B1(super.foo) : super(); // Ok.
}
-class C extends A {
- C(super.foo) : super(42); // Error.
+class C1 extends A1 {
+ C1(super.foo) : super(42); // Error.
+}
+
+class A2 {
+ final int foo;
+ final String bar;
+ A2(this.foo, this.bar);
+}
+
+class B2 extends A2 {
+ B2() : super(0, 1, 2); // Error.
+}
+
+class C2 extends A2 {
+ C2(super.foo) : super(); // Error.
}
main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.expect
@@ -2,30 +2,61 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-// C(super.foo) : super(42); // Error.
-// ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-// C(super.foo) : super(42); // Error.
-// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+// C1(super.foo) : super(42); // Error.
+// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+// C1(super.foo) : super(42); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+// B2() : super(0, 1, 2); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+// C2(super.foo) : super(); // Error.
+// ^
//
import self as self;
import "dart:core" as core;
-class A extends core::Object {
+class A1 extends core::Object {
final field core::int foo;
- constructor •(core::int foo) → self::A
- : self::A::foo = foo, super core::Object::•()
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
;
}
-class B extends self::A {
- constructor •(dynamic foo) → self::B
- : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+ constructor •(dynamic foo) → self::B1
+ : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
;
}
-class C extends self::A {
- constructor •(dynamic foo) → self::C
- : super self::A::•(42)
+class C1 extends self::A1 {
+ constructor •(dynamic foo) → self::C1
+ : super self::A1::•(42)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •(core::int foo, core::String bar) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+ B2() : super(0, 1, 2); // Error.
+ ^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •(dynamic foo) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+ C2(super.foo) : super(); // Error.
+ ^"
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.strong.transformed.expect
@@ -2,30 +2,61 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-// C(super.foo) : super(42); // Error.
-// ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-// C(super.foo) : super(42); // Error.
-// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+// C1(super.foo) : super(42); // Error.
+// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+// C1(super.foo) : super(42); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+// B2() : super(0, 1, 2); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+// C2(super.foo) : super(); // Error.
+// ^
//
import self as self;
import "dart:core" as core;
-class A extends core::Object {
+class A1 extends core::Object {
final field core::int foo;
- constructor •(core::int foo) → self::A
- : self::A::foo = foo, super core::Object::•()
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
;
}
-class B extends self::A {
- constructor •(dynamic foo) → self::B
- : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+ constructor •(dynamic foo) → self::B1
+ : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
;
}
-class C extends self::A {
- constructor •(dynamic foo) → self::C
- : super self::A::•(42)
+class C1 extends self::A1 {
+ constructor •(dynamic foo) → self::C1
+ : super self::A1::•(42)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •(core::int foo, core::String bar) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+ B2() : super(0, 1, 2); // Error.
+ ^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •(dynamic foo) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+ C2(super.foo) : super(); // Error.
+ ^"
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
index 942d614..a6fc5bc 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.textual_outline.expect
@@ -1,11 +1,22 @@
-class A {
+class A1 {
final int foo;
- A(this.foo);
+ A1(this.foo);
}
-class B extends A {
- B(super.foo) : super();
+class B1 extends A1 {
+ B1(super.foo) : super();
}
-class C extends A {
- C(super.foo) : super(42);
+class C1 extends A1 {
+ C1(super.foo) : super(42);
+}
+class A2 {
+ final int foo;
+ final String bar;
+ A2(this.foo, this.bar);
+}
+class B2 extends A2 {
+ B2() : super(0, 1, 2);
+}
+class C2 extends A2 {
+ C2(super.foo) : super();
}
main() {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.expect
@@ -2,30 +2,61 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-// C(super.foo) : super(42); // Error.
-// ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-// C(super.foo) : super(42); // Error.
-// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+// C1(super.foo) : super(42); // Error.
+// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+// C1(super.foo) : super(42); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+// B2() : super(0, 1, 2); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+// C2(super.foo) : super(); // Error.
+// ^
//
import self as self;
import "dart:core" as core;
-class A extends core::Object {
+class A1 extends core::Object {
final field core::int foo;
- constructor •(core::int foo) → self::A
- : self::A::foo = foo, super core::Object::•()
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
;
}
-class B extends self::A {
- constructor •(dynamic foo) → self::B
- : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+ constructor •(dynamic foo) → self::B1
+ : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
;
}
-class C extends self::A {
- constructor •(dynamic foo) → self::C
- : super self::A::•(42)
+class C1 extends self::A1 {
+ constructor •(dynamic foo) → self::C1
+ : super self::A1::•(42)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •(core::int foo, core::String bar) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+ B2() : super(0, 1, 2); // Error.
+ ^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •(dynamic foo) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+ C2(super.foo) : super(); // Error.
+ ^"
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.modular.expect
@@ -2,30 +2,61 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-// C(super.foo) : super(42); // Error.
-// ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-// C(super.foo) : super(42); // Error.
-// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+// C1(super.foo) : super(42); // Error.
+// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+// C1(super.foo) : super(42); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+// B2() : super(0, 1, 2); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+// C2(super.foo) : super(); // Error.
+// ^
//
import self as self;
import "dart:core" as core;
-class A extends core::Object {
+class A1 extends core::Object {
final field core::int foo;
- constructor •(core::int foo) → self::A
- : self::A::foo = foo, super core::Object::•()
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
;
}
-class B extends self::A {
- constructor •(dynamic foo) → self::B
- : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+ constructor •(dynamic foo) → self::B1
+ : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
;
}
-class C extends self::A {
- constructor •(dynamic foo) → self::C
- : super self::A::•(42)
+class C1 extends self::A1 {
+ constructor •(dynamic foo) → self::C1
+ : super self::A1::•(42)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •(core::int foo, core::String bar) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+ B2() : super(0, 1, 2); // Error.
+ ^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •(dynamic foo) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+ C2(super.foo) : super(); // Error.
+ ^"
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
index 767d2ef..184b3f4 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.outline.expect
@@ -2,17 +2,31 @@
import self as self;
import "dart:core" as core;
-class A extends core::Object {
+class A1 extends core::Object {
final field core::int foo;
- constructor •(core::int foo) → self::A
+ constructor •(core::int foo) → self::A1
;
}
-class B extends self::A {
- constructor •(dynamic foo) → self::B
+class B1 extends self::A1 {
+ constructor •(dynamic foo) → self::B1
;
}
-class C extends self::A {
- constructor •(dynamic foo) → self::C
+class C1 extends self::A1 {
+ constructor •(dynamic foo) → self::C1
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •(core::int foo, core::String bar) → self::A2
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ ;
+}
+class C2 extends self::A2 {
+ constructor •(dynamic foo) → self::C2
;
}
static method main() → dynamic
diff --git a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
index 630145e..228f432 100644
--- a/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart.weak.transformed.expect
@@ -2,30 +2,61 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:23: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
-// C(super.foo) : super(42); // Error.
-// ^
-// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:11: Context: This is the super-initializer parameter.
-// C(super.foo) : super(42); // Error.
-// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:24: Error: Positional super-initializer parameters cannot be used when the super initializer has positional arguments.
+// C1(super.foo) : super(42); // Error.
+// ^
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:15:12: Context: This is the super-initializer parameter.
+// C1(super.foo) : super(42); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+// Try removing the extra positional arguments.
+// B2() : super(0, 1, 2); // Error.
+// ^
+//
+// pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+// C2(super.foo) : super(); // Error.
+// ^
//
import self as self;
import "dart:core" as core;
-class A extends core::Object {
+class A1 extends core::Object {
final field core::int foo;
- constructor •(core::int foo) → self::A
- : self::A::foo = foo, super core::Object::•()
+ constructor •(core::int foo) → self::A1
+ : self::A1::foo = foo, super core::Object::•()
;
}
-class B extends self::A {
- constructor •(dynamic foo) → self::B
- : super self::A::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
+class B1 extends self::A1 {
+ constructor •(dynamic foo) → self::B1
+ : super self::A1::•(foo as{TypeError,ForDynamic,ForNonNullableByDefault} core::int)
;
}
-class C extends self::A {
- constructor •(dynamic foo) → self::C
- : super self::A::•(42)
+class C1 extends self::A1 {
+ constructor •(dynamic foo) → self::C1
+ : super self::A1::•(42)
+ ;
+}
+class A2 extends core::Object {
+ final field core::int foo;
+ final field core::String bar;
+ constructor •(core::int foo, core::String bar) → self::A2
+ : self::A2::foo = foo, self::A2::bar = bar, super core::Object::•()
+ ;
+}
+class B2 extends self::A2 {
+ constructor •() → self::B2
+ : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:25:15: Error: Too many positional arguments: 2 allowed, but 3 found.
+Try removing the extra positional arguments.
+ B2() : super(0, 1, 2); // Error.
+ ^"
+ ;
+}
+class C2 extends self::A2 {
+ constructor •(dynamic foo) → self::C2
+ : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/super_parameters/simple_positional_super_parameters.dart:29:24: Error: Too few positional arguments: 2 required, 1 given.
+ C2(super.foo) : super(); // Error.
+ ^"
;
}
static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 9eb437c..5df5fee 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -200,6 +200,7 @@
regress/issue_41265.crash: Crash
regress/issue_41265.crash: FormatterCrash
super_parameters/simple: FormatterCrash
+super_parameters/simple_named_super_parameters: FormatterCrash
super_parameters/simple_positional_super_parameters: FormatterCrash
super_parameters/typed_super_parameter: FormatterCrash
triple_shift/invalid_operator: FormatterCrash