Version 2.18.0-195.0.dev
Merge commit '8bc1d8e9fb87d797475fdc52cf42cc931ee37c71' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 985dc64..a489884 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -1067,15 +1067,6 @@
new DelayedDefaultValueCloner(
superConstructor, constructor, substitutionMap,
libraryBuilder: classBuilder.libraryBuilder);
- if (!isConst) {
- // For constant constructors default values are computed and cloned part
- // of the outline expression and therefore passed to the
- // [SyntheticConstructorBuilder] below.
- //
- // For non-constant constructors default values are cloned as part of the
- // full compilation using [_delayedDefaultValueCloners].
- registerDelayedDefaultValueCloner(delayedDefaultValueCloner);
- }
TypeDependency? typeDependency;
if (hasTypeDependency) {
@@ -1117,10 +1108,7 @@
}
void registerDelayedDefaultValueCloner(DelayedDefaultValueCloner cloner) {
- // TODO(johnniwinther): Avoid re-registration of cloners.
- assert(
- !_delayedDefaultValueCloners.containsKey(cloner.synthesized) ||
- _delayedDefaultValueCloners[cloner.synthesized] == cloner,
+ assert(!_delayedDefaultValueCloners.containsKey(cloner.synthesized),
"Default cloner already registered for ${cloner.synthesized}.");
_delayedDefaultValueCloners[cloner.synthesized] = cloner;
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
index 00b7e5e..1548e9e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart
@@ -94,6 +94,8 @@
bool _hasFormalsInferred = false;
+ bool _hasDefaultValueCloner = false;
+
final bool _hasSuperInitializingFormals;
final List<DelayedDefaultValueCloner> _superParameterDefaultValueCloners =
@@ -460,12 +462,18 @@
}
if (positionalSuperParameters != null || namedSuperParameters != null) {
- delayedDefaultValueCloners.add(new DelayedDefaultValueCloner(
- superTarget, constructor, substitution,
- positionalSuperParameters: positionalSuperParameters ?? const <int>[],
- namedSuperParameters: namedSuperParameters ?? const <String>[],
- isOutlineNode: true,
- libraryBuilder: libraryBuilder));
+ if (!_hasDefaultValueCloner) {
+ // If this constructor formals are part of a cyclic dependency this
+ // might be called more than once.
+ delayedDefaultValueCloners.add(new DelayedDefaultValueCloner(
+ superTarget, constructor, substitution,
+ positionalSuperParameters:
+ positionalSuperParameters ?? const <int>[],
+ namedSuperParameters: namedSuperParameters ?? const <String>[],
+ isOutlineNode: true,
+ libraryBuilder: libraryBuilder));
+ _hasDefaultValueCloner = true;
+ }
}
}
@@ -879,6 +887,12 @@
origin.addSuperParameterDefaultValueCloners(delayedDefaultValueCloners);
}
if (_delayedDefaultValueCloner != null) {
+ // For constant constructors default values are computed and cloned part
+ // of the outline expression and we there set `isOutlineNode` to `true`
+ // below.
+ //
+ // For non-constant constructors default values are cloned as part of the
+ // full compilation using `KernelTarget._delayedDefaultValueCloners`.
delayedDefaultValueCloners
.add(_delayedDefaultValueCloner!..isOutlineNode = true);
_delayedDefaultValueCloner = null;
diff --git a/pkg/front_end/testcases/general/issue49254.dart b/pkg/front_end/testcases/general/issue49254.dart
new file mode 100644
index 0000000..cae95e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, 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 C3 extends B3 {
+ C3(super.bar) : super();
+}
+
+class B3 extends A3 {
+ var bar = A3.initializeFoo;
+ B3(this.bar) : super();
+}
+
+class A3 {
+ var foo = C3.new; // Error.
+ A3();
+ A3.initializeFoo(this.foo);
+}
diff --git a/pkg/front_end/testcases/general/issue49254.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue49254.dart.textual_outline.expect
new file mode 100644
index 0000000..69e8cf5
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart.textual_outline.expect
@@ -0,0 +1,14 @@
+class C3 extends B3 {
+ C3(super.bar) : super();
+}
+
+class B3 extends A3 {
+ var bar = A3.initializeFoo;
+ B3(this.bar) : super();
+}
+
+class A3 {
+ var foo = C3.new;
+ A3();
+ A3.initializeFoo(this.foo);
+}
diff --git a/pkg/front_end/testcases/general/issue49254.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue49254.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..c569daf
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart.textual_outline_modelled.expect
@@ -0,0 +1,14 @@
+class A3 {
+ A3();
+ A3.initializeFoo(this.foo);
+ var foo = C3.new;
+}
+
+class B3 extends A3 {
+ B3(this.bar) : super();
+ var bar = A3.initializeFoo;
+}
+
+class C3 extends B3 {
+ C3(super.bar) : super();
+}
diff --git a/pkg/front_end/testcases/general/issue49254.dart.weak.expect b/pkg/front_end/testcases/general/issue49254.dart.weak.expect
new file mode 100644
index 0000000..0285271
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart.weak.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue49254.dart:10:7: Error: Can't infer the type of 'bar': circularity found during type inference.
+// Specify the type explicitly.
+// var bar = A3.initializeFoo;
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C3 extends self::B3 {
+ constructor •(invalid-type bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+class B3 extends self::A3 {
+ field invalid-type bar = #C1;
+ constructor •(invalid-type bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class A3 extends core::Object {
+ field (invalid-type) → self::C3 foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo((invalid-type) → self::C3 foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+
+constants {
+ #C1 = constructor-tearoff self::A3::initializeFoo
+ #C2 = constructor-tearoff self::C3::•
+}
diff --git a/pkg/front_end/testcases/general/issue49254.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue49254.dart.weak.modular.expect
new file mode 100644
index 0000000..0285271
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart.weak.modular.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue49254.dart:10:7: Error: Can't infer the type of 'bar': circularity found during type inference.
+// Specify the type explicitly.
+// var bar = A3.initializeFoo;
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C3 extends self::B3 {
+ constructor •(invalid-type bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+class B3 extends self::A3 {
+ field invalid-type bar = #C1;
+ constructor •(invalid-type bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class A3 extends core::Object {
+ field (invalid-type) → self::C3 foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo((invalid-type) → self::C3 foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+
+constants {
+ #C1 = constructor-tearoff self::A3::initializeFoo
+ #C2 = constructor-tearoff self::C3::•
+}
diff --git a/pkg/front_end/testcases/general/issue49254.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue49254.dart.weak.outline.expect
new file mode 100644
index 0000000..a548b9c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart.weak.outline.expect
@@ -0,0 +1,28 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue49254.dart:10:7: Error: Can't infer the type of 'bar': circularity found during type inference.
+// Specify the type explicitly.
+// var bar = A3.initializeFoo;
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C3 extends self::B3 {
+ constructor •(invalid-type bar) → self::C3
+ ;
+}
+class B3 extends self::A3 {
+ field invalid-type bar;
+ constructor •(invalid-type bar) → self::B3
+ ;
+}
+class A3 extends core::Object {
+ field (invalid-type) → self::C3 foo;
+ constructor •() → self::A3
+ ;
+ constructor initializeFoo((invalid-type) → self::C3 foo) → self::A3
+ ;
+}
diff --git a/pkg/front_end/testcases/general/issue49254.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue49254.dart.weak.transformed.expect
new file mode 100644
index 0000000..0285271
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue49254.dart.weak.transformed.expect
@@ -0,0 +1,37 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue49254.dart:10:7: Error: Can't infer the type of 'bar': circularity found during type inference.
+// Specify the type explicitly.
+// var bar = A3.initializeFoo;
+// ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C3 extends self::B3 {
+ constructor •(invalid-type bar) → self::C3
+ : super self::B3::•(bar)
+ ;
+}
+class B3 extends self::A3 {
+ field invalid-type bar = #C1;
+ constructor •(invalid-type bar) → self::B3
+ : self::B3::bar = bar, super self::A3::•()
+ ;
+}
+class A3 extends core::Object {
+ field (invalid-type) → self::C3 foo = #C2;
+ constructor •() → self::A3
+ : super core::Object::•()
+ ;
+ constructor initializeFoo((invalid-type) → self::C3 foo) → self::A3
+ : self::A3::foo = foo, super core::Object::•()
+ ;
+}
+
+constants {
+ #C1 = constructor-tearoff self::A3::initializeFoo
+ #C2 = constructor-tearoff self::C3::•
+}
diff --git a/tools/VERSION b/tools/VERSION
index db9f6c8..f9a9820 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 194
+PRERELEASE 195
PRERELEASE_PATCH 0
\ No newline at end of file