Version 2.15.0-10.0.dev

Merge commit '29419292d5605a1fad8536c1b01bd4d0404db745' into 'dev'
diff --git a/pkg/analyzer_plugin/doc/tutorial/introduction.md b/pkg/analyzer_plugin/doc/tutorial/introduction.md
index d2da2ff..033031a 100644
--- a/pkg/analyzer_plugin/doc/tutorial/introduction.md
+++ b/pkg/analyzer_plugin/doc/tutorial/introduction.md
@@ -134,7 +134,7 @@
 
 Navigation information can be requested both by an `analysis.getNavigation`
 request and by a subscription. If the server has subscribed for navigation
-information in some set of files, the the plugin should send the information in
+information in some set of files, then the plugin should send the information in
 an `analysis.navigation` notification whenever the information needs to be
 updated.
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 160abbe..e80fead 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -9351,9 +9351,9 @@
   closure_signature.FinalizeNameArray();
   closure_function.InheritKernelOffsetFrom(*this);
 
-  // Change covariant parameter types to either Object? for an opted-in implicit
-  // closure or to Object* for a legacy implicit closure.
   if (!is_static() && !IsConstructor()) {
+    // Change covariant parameter types to either Object? for an opted-in
+    // implicit closure or to Object* for a legacy implicit closure.
     BitVector is_covariant(zone, NumParameters());
     BitVector is_generic_covariant_impl(zone, NumParameters());
     kernel::ReadParameterCovariance(*this, &is_covariant,
@@ -9372,6 +9372,22 @@
         closure_signature.SetParameterTypeAt(i, object_type);
       }
     }
+  } else if (IsConstructor() && closure_signature.IsGeneric()) {
+    // Instantiate types of parameters as they may reference
+    // class type parameters.
+    const auto& instantiator_type_args = TypeArguments::Handle(
+        zone, AbstractType::Handle(zone, closure_signature.result_type())
+                  .arguments());
+    auto& param_type = AbstractType::Handle(zone);
+    for (intptr_t i = kClosure; i < num_params; ++i) {
+      param_type = closure_signature.ParameterTypeAt(i);
+      if (!param_type.IsInstantiated()) {
+        param_type = param_type.InstantiateFrom(instantiator_type_args,
+                                                Object::null_type_arguments(),
+                                                kAllFree, Heap::kOld);
+        closure_signature.SetParameterTypeAt(i, param_type);
+      }
+    }
   }
   ASSERT(!closure_signature.IsFinalized());
   closure_signature ^= ClassFinalizer::FinalizeType(closure_signature);
diff --git a/tools/VERSION b/tools/VERSION
index d25666f..5d291c9 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 9
+PRERELEASE 10
 PRERELEASE_PATCH 0
\ No newline at end of file