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