diff --git a/compiler/src/dotty/tools/dotc/typer/Inliner.scala b/compiler/src/dotty/tools/dotc/typer/Inliner.scala index 722e3abfec85..6dfdc6167bb3 100644 --- a/compiler/src/dotty/tools/dotc/typer/Inliner.scala +++ b/compiler/src/dotty/tools/dotc/typer/Inliner.scala @@ -849,13 +849,15 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(using Context) { def searchImplicit(tpt: Tree) = val evTyper = new Typer(ctx.nestingLevel + 1) val evCtx = ctx.fresh.setTyper(evTyper) - val evidence = evTyper.inferImplicitArg(tpt.tpe, tpt.span)(using evCtx) - evidence.tpe match - case fail: Implicits.SearchFailureType => - val msg = evTyper.missingArgMsg(evidence, tpt.tpe, "") - errorTree(tpt, em"$msg") - case _ => - evidence + inContext(evCtx) { + val evidence = evTyper.inferImplicitArg(tpt.tpe, tpt.span) + evidence.tpe match + case fail: Implicits.SearchFailureType => + val msg = evTyper.missingArgMsg(evidence, tpt.tpe, "") + errorTree(call, em"$msg") + case _ => + evidence + } return searchImplicit(callTypeArgs.head) } @@ -1318,17 +1320,19 @@ class Inliner(call: tpd.Tree, rhsToInline: tpd.Tree)(using Context) { def searchImplicit(sym: TermSymbol, tpt: Tree) = { val evTyper = new Typer(ctx.nestingLevel + 1) val evCtx = ctx.fresh.setTyper(evTyper) - val evidence = evTyper.inferImplicitArg(tpt.tpe, tpt.span)(using evCtx) - evidence.tpe match { - case fail: Implicits.AmbiguousImplicits => - report.error(evTyper.missingArgMsg(evidence, tpt.tpe, ""), tpt.srcPos) - true // hard error: return true to stop implicit search here - case fail: Implicits.SearchFailureType => - false - case _ => - //inlining.println(i"inferred implicit $sym: ${sym.info} with $evidence: ${evidence.tpe.widen}, ${evCtx.gadt.constraint}, ${evCtx.typerState.constraint}") - newTermBinding(sym, evidence) - true + inContext(evCtx) { + val evidence = evTyper.inferImplicitArg(tpt.tpe, tpt.span) + evidence.tpe match { + case fail: Implicits.AmbiguousImplicits => + report.error(evTyper.missingArgMsg(evidence, tpt.tpe, ""), tpt.srcPos) + true // hard error: return true to stop implicit search here + case fail: Implicits.SearchFailureType => + false + case _ => + //inlining.println(i"inferred implicit $sym: ${sym.info} with $evidence: ${evidence.tpe.widen}, ${evCtx.gadt.constraint}, ${evCtx.typerState.constraint}") + newTermBinding(sym, evidence) + true + } } } diff --git a/tests/neg-macros/i13406/Qux_1.scala b/tests/neg-macros/i13406/Qux_1.scala new file mode 100644 index 000000000000..f68c92de6612 --- /dev/null +++ b/tests/neg-macros/i13406/Qux_1.scala @@ -0,0 +1,4 @@ +// Qux_1.scala +sealed trait Qux[T] // anonymous mirror because no companion +object QuxImpl: + case class Foo[A](a: A) extends Qux[A] diff --git a/tests/neg-macros/i13406/Test_2.scala b/tests/neg-macros/i13406/Test_2.scala new file mode 100644 index 000000000000..f2cb0a3f05ee --- /dev/null +++ b/tests/neg-macros/i13406/Test_2.scala @@ -0,0 +1,8 @@ +// Test_2.scala +trait Bar + +inline given derivedReducible(using scala.deriving.Mirror.SumOf[Qux[_]]): Bar = + scala.compiletime.summonInline[Bar] + ??? + +def test = derivedReducible // error