Skip to content

Commit 271aaf0

Browse files
committed
Fix #3348: use a new typeState in inferView
`inferImplicit` has an useful invariant that the constraint doesn't change in the case of implicit resolution failure. However, this invariant may not hold if completions are triggered during implicit resolution. By create a new typeState for inferView, we ensure that the useful invariant holds in such cases.
1 parent 174444d commit 271aaf0

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,9 +2224,11 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
22242224
if (isFullyDefined(wtp, force = ForceDegree.all) &&
22252225
ctx.typerState.constraint.ne(prevConstraint)) adapt(tree, pt)
22262226
else err.typeMismatch(tree, pt, failure)
2227-
if (ctx.mode.is(Mode.ImplicitsEnabled))
2228-
inferView(tree, pt) match {
2227+
if (ctx.mode.is(Mode.ImplicitsEnabled)) {
2228+
val nestedCtx = ctx.fresh.setNewTyperState()
2229+
inferView(tree, pt)(nestedCtx) match {
22292230
case SearchSuccess(inferred, _, _, _) =>
2231+
nestedCtx.typerState.commit()
22302232
adapt(inferred, pt)(ctx.retractMode(Mode.ImplicitsEnabled))
22312233
case failure: SearchFailure =>
22322234
if (pt.isInstanceOf[ProtoType] && !failure.isInstanceOf[AmbiguousImplicits])
@@ -2236,6 +2238,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
22362238
tree
22372239
else recover(failure)
22382240
}
2241+
}
22392242
else recover(NoImplicitMatches)
22402243
}
22412244

0 commit comments

Comments
 (0)