@@ -18,7 +18,7 @@ import Names.{Name, TermName}
1818import NameKinds .{InlineAccessorName , InlineBinderName , InlineScrutineeName }
1919import ProtoTypes .selectionProto
2020import SymDenotations .SymDenotation
21- import Inferencing .fullyDefinedType
21+ import Inferencing .isFullyDefined
2222import config .Printers .inlining
2323import ErrorReporting .errorTree
2424import dotty .tools .dotc .tastyreflect .ReflectionImpl
@@ -242,8 +242,10 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
242242
243243 inlining.println(i " ----------------------- \n Inlining $call\n With RHS $rhsToInline" )
244244
245- // Make sure all type arguments to the call are fully determined
246- for (targ <- callTypeArgs) fullyDefinedType(targ.tpe, " inlined type argument" , targ.span)
245+ // Make sure all type arguments to the call are fully determined,
246+ // but continue if that's not achievable (or else i7459.scala would crash).
247+ for arg <- callTypeArgs do
248+ isFullyDefined(arg.tpe, ForceDegree .all)
247249
248250 /** A map from parameter names of the inlineable method to references of the actual arguments.
249251 * For a type argument this is the full argument type.
@@ -316,9 +318,9 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
316318
317319 /** Populate `paramBinding` and `bindingsBuf` by matching parameters with
318320 * corresponding arguments. `bindingbuf` will be further extended later by
319- * proxies to this-references.
321+ * proxies to this-references. Issue an error if some arguments are missing.
320322 */
321- private def computeParamBindings (tp : Type , targs : List [Tree ], argss : List [List [Tree ]]): Unit = tp match {
323+ private def computeParamBindings (tp : Type , targs : List [Tree ], argss : List [List [Tree ]]): Boolean = tp match
322324 case tp : PolyType =>
323325 tp.paramNames.lazyZip(targs).foreach { (name, arg) =>
324326 paramSpan(name) = arg.span
@@ -327,8 +329,8 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
327329 computeParamBindings(tp.resultType, Nil , argss)
328330 case tp : MethodType =>
329331 if argss.isEmpty then
330- // can happen if arguments have errors, see i7438.scala
331332 ctx.error(i " mising arguments for inline method $inlinedMethod" , call.sourcePos)
333+ false
332334 else
333335 tp.paramNames.lazyZip(tp.paramInfos).lazyZip(argss.head).foreach { (name, paramtp, arg) =>
334336 paramSpan(name) = arg.span
@@ -341,7 +343,7 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
341343 case _ =>
342344 assert(targs.isEmpty)
343345 assert(argss.isEmpty)
344- }
346+ true
345347
346348 // Compute val-definitions for all this-proxies and append them to `bindingsBuf`
347349 private def computeThisBindings () = {
@@ -450,7 +452,8 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(implicit ctx: Context) {
450452 }
451453
452454 // Compute bindings for all parameters, appending them to bindingsBuf
453- computeParamBindings(inlinedMethod.info, callTypeArgs, callValueArgss)
455+ if ! computeParamBindings(inlinedMethod.info, callTypeArgs, callValueArgss) then
456+ return call
454457
455458 // make sure prefix is executed if it is impure
456459 if (! isIdempotentExpr(inlineCallPrefix)) registerType(inlinedMethod.owner.thisType)
0 commit comments