Version 2.16.0-105.0.dev
Merge commit '843583f3564a27d78640859217f22db36c881988' into 'dev'
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/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 7bc120f..eeb3f6f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -72,7 +72,7 @@
import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
import '../loader.dart' show Loader, untranslatableUriScheme;
-import '../problems.dart' show internalProblem, unhandled;
+import '../problems.dart' show internalProblem;
import '../scope.dart';
import '../ticker.dart' show Ticker;
import '../type_inference/type_inference_engine.dart';
@@ -527,9 +527,8 @@
}
accessor ??= _builders[accessorUri];
if (accessor == null) {
- if (libraryBuilder.loader == this && first != libraryBuilder) {
- unhandled("null", "accessor", charOffset, uri);
- }
+ // TODO(johnniwinther): Separate reading of imports/exports/parts from
+ // reading entry points.
} else {
libraryBuilder.recordAccess(charOffset, noLength, accessor.fileUri);
if (!accessor.isPatch &&
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml b/pkg/front_end/testcases/incremental/change_main.yaml
new file mode 100644
index 0000000..e7167fa
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml
@@ -0,0 +1,59 @@
+# Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
+# Change entry point between deltas, provoking the read of the new entry
+# point before the read of the previous entry point. This triggers the crash
+# in https://github.com/flutter/flutter/issues/95014
+
+type: newworld
+worlds:
+ - entry: first.dart
+ experiments: alternative-invalidation-strategy
+ sources:
+ first.dart: |
+ import 'second.dart';
+
+ main() {
+ method1();
+ method2();
+ }
+ method1() {}
+ second.dart: |
+ import 'first.dart';
+
+ main() {
+ method1();
+ method2();
+ }
+ method2() {}
+ expectedLibraryCount: 2
+ - entry: second.dart
+ experiments: alternative-invalidation-strategy
+ worldType: updated
+ expectInitializeFromDill: false
+ invalidate:
+ [second.dart, first.dart]
+ sources:
+ first.dart: |
+ import 'second.dart';
+
+ main() {
+ method1();
+ method2();
+ }
+ method1() {
+ print('method1');
+ }
+ second.dart: |
+ import 'first.dart';
+
+ main() {
+ method1();
+ method2();
+ }
+ method2() {
+ print('method2');
+ }
+ expectedLibraryCount: 2
+ expectsRebuildBodiesOnly: true
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect b/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect
new file mode 100644
index 0000000..1e283df
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml.world.1.expect
@@ -0,0 +1,21 @@
+main = fir::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+ import "org-dartlang-test:///second.dart";
+
+ static method main() → dynamic {
+ fir::method1();
+ sec::method2();
+ }
+ static method method1() → dynamic {}
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+ import "org-dartlang-test:///first.dart";
+
+ static method main() → dynamic {
+ fir::method1();
+ sec::method2();
+ }
+ static method method2() → dynamic {}
+}
diff --git a/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect b/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect
new file mode 100644
index 0000000..df10188
--- /dev/null
+++ b/pkg/front_end/testcases/incremental/change_main.yaml.world.2.expect
@@ -0,0 +1,25 @@
+main = sec::main;
+library from "org-dartlang-test:///first.dart" as fir {
+
+ import "org-dartlang-test:///second.dart";
+
+ static method main() → dynamic {
+ fir::method1();
+ sec::method2();
+ }
+ static method method1() → dynamic {
+ dart.core::print("method1");
+ }
+}
+library from "org-dartlang-test:///second.dart" as sec {
+
+ import "org-dartlang-test:///first.dart";
+
+ static method main() → dynamic {
+ fir::method1();
+ sec::method2();
+ }
+ static method method2() → dynamic {
+ dart.core::print("method2");
+ }
+}
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
diff --git a/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart b/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart
new file mode 100644
index 0000000..548a2d4
--- /dev/null
+++ b/runtime/tests/vm/dart/write_barrier_load_late_field_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test attempts to verify that the slow path for late static and
+// instance field initialization appropriately restores the write barrier
+// invariant.
+
+import 'dart:_internal';
+
+class Box {
+ var field;
+}
+
+late var global = (() {
+ VMInternalsForTesting.collectAllGarbage();
+ return 10;
+})();
+
+@pragma('vm:never-inline')
+foo() {
+ final kTrue = int.parse('1') == 1;
+ final box = Box(); // Ensure this box is allocated new
+ if (kTrue) {
+ global; // Will not block write-barrier elimination (GC in here should restore invariants)
+ box.field = Box()..field = 42; // Runtime should've made `box` remembered.
+ VMInternalsForTesting.collectAllGarbage();
+ }
+ return box;
+}
+
+main() {
+ if (foo().field.field != 42) throw 'a';
+}
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 0540135..cd7dcb5 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -4203,13 +4203,11 @@
auto& stub = Code::ZoneHandle(compiler->zone());
__ Bind(&call_initializer);
if (field().needs_load_guard()) {
- ASSERT(!CanCallDart());
stub = object_store->init_static_field_stub();
} else if (field().is_late()) {
// The stubs below call the initializer function directly, so make sure
// one is created.
original_field.EnsureInitializerFunction();
- ASSERT(CanCallDart());
stub = field().is_final()
? object_store->init_late_final_static_field_stub()
: object_store->init_late_static_field_stub();
@@ -4217,7 +4215,6 @@
// We call to runtime for non-late fields because the stub would need to
// catch any exception generated by the initialization function to change
// the value of the static field from the transition sentinel to null.
- ASSERT(!CanCallDart());
stub = object_store->init_static_field_stub();
}
@@ -4260,19 +4257,15 @@
auto object_store = compiler->isolate_group()->object_store();
auto& stub = Code::ZoneHandle(compiler->zone());
if (field.needs_load_guard()) {
- ASSERT(!CanCallDart());
stub = object_store->init_instance_field_stub();
} else if (field.is_late()) {
if (!field.has_nontrivial_initializer()) {
- // Common stub calls runtime which will throw an exception.
- ASSERT(!CanCallDart());
stub = object_store->init_instance_field_stub();
} else {
// Stubs for late field initialization call initializer
// function directly, so make sure one is created.
original_field.EnsureInitializerFunction();
- ASSERT(CanCallDart());
if (field.is_final()) {
stub = object_store->init_late_final_instance_field_stub();
} else {
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index 8d6cf9b..c261131 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -5596,12 +5596,8 @@
const Field* field = nullptr)
: Base(source, deopt_id),
token_pos_(source.token_pos),
- calls_runtime_on_initialization_(
- field != nullptr &&
- (!field->is_late() || field->needs_load_guard())),
- throw_exception_on_initialization_(field != nullptr &&
- !field->has_initializer() &&
- !calls_runtime_on_initialization_),
+ throw_exception_on_initialization_(
+ field != nullptr && !field->has_initializer() && field->is_late()),
calls_initializer_(calls_initializer) {
ASSERT(!calls_initializer || field != nullptr);
ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
@@ -5634,15 +5630,17 @@
}
virtual bool CanCallDart() const {
- return calls_initializer() && !throw_exception_on_initialization() &&
- !calls_runtime_on_initialization_;
+ // The slow path (running the field initializer) always calls one of a
+ // specific set of stubs. For those stubs that do not simply call the
+ // runtime, the GC recognizes their frames and restores write barriers
+ // automatically (see Thread::RestoreWriteBarrierInvariant).
+ return false;
}
virtual bool CanTriggerGC() const { return calls_initializer(); }
virtual bool MayThrow() const { return calls_initializer(); }
private:
const TokenPosition token_pos_;
- const bool calls_runtime_on_initialization_;
const bool throw_exception_on_initialization_;
bool calls_initializer_;
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index 936d432..1275b14 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -298,8 +298,59 @@
},
kMoveGlob));
- EXPECT(store1->ShouldEmitStoreBarrier());
- EXPECT(store2->ShouldEmitStoreBarrier());
+ EXPECT(!store1->ShouldEmitStoreBarrier());
+ EXPECT(!store2->ShouldEmitStoreBarrier());
+}
+
+ISOLATE_UNIT_TEST_CASE(IRTest_WriteBarrierElimination_LoadLateStaticField) {
+ DEBUG_ONLY(
+ SetFlagScope<bool> sfs(&FLAG_trace_write_barrier_elimination, true));
+ const char* kScript = R"(
+ class A {
+ }
+
+ class B {
+ }
+
+ class C {
+ C(this.a, this.b);
+ A a;
+ B b;
+ }
+
+ late var x = new B();
+
+ foo(A a) => C(a, x);
+
+ main() { foo(A()); }
+ )";
+
+ const auto& root_library = Library::Handle(LoadTestScript(kScript));
+
+ Invoke(root_library, "main");
+
+ const auto& function = Function::Handle(GetFunction(root_library, "foo"));
+ TestPipeline pipeline(function, CompilerPass::kJIT);
+ FlowGraph* flow_graph = pipeline.RunPasses({});
+
+ auto entry = flow_graph->graph_entry()->normal_entry();
+ EXPECT(entry != nullptr);
+
+ StoreInstanceFieldInstr* store1 = nullptr;
+ StoreInstanceFieldInstr* store2 = nullptr;
+
+ ILMatcher cursor(flow_graph, entry);
+ RELEASE_ASSERT(cursor.TryMatch(
+ {
+ kMatchAndMoveAllocateObject,
+ kMatchAndMoveLoadStaticField,
+ {kMatchAndMoveStoreInstanceField, &store1},
+ {kMatchAndMoveStoreInstanceField, &store2},
+ },
+ kMoveGlob));
+
+ EXPECT(!store1->ShouldEmitStoreBarrier());
+ EXPECT(!store2->ShouldEmitStoreBarrier());
}
} // namespace dart
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 5e838e6..6efc403 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -15,6 +15,7 @@
#include "vm/message_handler.h"
#include "vm/native_entry.h"
#include "vm/object.h"
+#include "vm/object_store.h"
#include "vm/os_thread.h"
#include "vm/profiler.h"
#include "vm/runtime_entry.h"
@@ -726,12 +727,28 @@
ValidationPolicy::kDontValidateFrames,
this, cross_thread_policy);
RestoreWriteBarrierInvariantVisitor visitor(isolate_group(), this, op);
+ ObjectStore* object_store = isolate_group()->object_store();
bool scan_next_dart_frame = false;
for (StackFrame* frame = frames_iterator.NextFrame(); frame != NULL;
frame = frames_iterator.NextFrame()) {
if (frame->IsExitFrame()) {
scan_next_dart_frame = true;
- } else if (frame->IsDartFrame(/*validate=*/false)) {
+ } else if (frame->IsEntryFrame()) {
+ /* Continue searching. */
+ } else if (frame->IsStubFrame()) {
+ const uword pc = frame->pc();
+ if (Code::ContainsInstructionAt(
+ object_store->init_late_static_field_stub(), pc) ||
+ Code::ContainsInstructionAt(
+ object_store->init_late_final_static_field_stub(), pc) ||
+ Code::ContainsInstructionAt(
+ object_store->init_late_instance_field_stub(), pc) ||
+ Code::ContainsInstructionAt(
+ object_store->init_late_final_instance_field_stub(), pc)) {
+ scan_next_dart_frame = true;
+ }
+ } else {
+ ASSERT(frame->IsDartFrame(/*validate=*/false));
if (scan_next_dart_frame) {
frame->VisitObjectPointers(&visitor);
}
diff --git a/tools/VERSION b/tools/VERSION
index 2b9050c..51977ba 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 16
PATCH 0
-PRERELEASE 104
+PRERELEASE 105
PRERELEASE_PATCH 0
\ No newline at end of file