Skip to content

Commit daeae71

Browse files
committed
Fix: Use cap instead of Fresh.Cap for parameter types of methods
1 parent 4b37a9a commit daeae71

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

compiler/src/dotty/tools/dotc/cc/Fresh.scala

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,9 @@ object Fresh:
8989

9090
lazy val inverse = new BiTypeMap:
9191
def apply(t: Type): Type = t match
92-
case t @ Cap(_) => defn.captureRoot.termRef
92+
case t @ Cap(_) =>
93+
change = true
94+
defn.captureRoot.termRef
9395
case _ => mapOver(t)
9496
def inverse = thisMap
9597
override def toString = thisMap.toString + ".inverse"
@@ -104,6 +106,16 @@ object Fresh:
104106
if mapper.change then mapped else tp
105107
else
106108
tp
109+
110+
/** Maps fresh to cap */
111+
def toCap(tp: Type)(using Context): Type =
112+
if ccConfig.useFresh then
113+
val fromCap = FromCap(NoSymbol)
114+
val mapper = fromCap.inverse
115+
val mapped = mapper(tp)
116+
if fromCap.change then mapped else tp
117+
else
118+
tp
107119
end Fresh
108120

109121

compiler/src/dotty/tools/dotc/cc/Setup.scala

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -430,15 +430,20 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
430430
def setupTraverser(checker: CheckerAPI) = new TreeTraverserWithPreciseImportContexts:
431431
import checker.*
432432

433+
private val paramSigChange = util.EqHashSet[Tree]()
434+
433435
/** Transform type of tree, and remember the transformed type as the type the tree */
434436
private def transformTT(tree: TypeTree, sym: Symbol, boxed: Boolean)(using Context): Unit =
435437
if !tree.hasNuType then
436-
val transformed =
438+
var transformed =
437439
if tree.isInferred
438440
then transformInferredType(tree.tpe)
439441
else transformExplicitType(tree.tpe, tptToCheck = tree)
442+
if boxed then transformed = box(transformed)
443+
if sym.is(Param) && (transformed ne tree.tpe) then
444+
paramSigChange += tree
440445
tree.setNuType(
441-
if boxed then box(transformed) else Fresh.fromCap(transformed, sym))
446+
if boxed then transformed else Fresh.fromCap(transformed, sym))
442447

443448
/** Transform the type of a val or var or the result type of a def */
444449
def transformResultType(tpt: TypeTree, sym: Symbol)(using Context): Unit =
@@ -504,6 +509,9 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
504509
inContext(ctx.withOwner(sym))
505510
traverseChildren(tree)
506511

512+
case tree @ TypeDef(_, rhs: TypeTree) =>
513+
transformTT(rhs, tree.symbol, boxed = false)
514+
507515
case tree @ SeqLiteral(elems, tpt: TypeTree) =>
508516
traverse(elems)
509517
tpt.setNuType(box(transformInferredType(tpt.tpe)))
@@ -547,8 +555,8 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
547555
def paramSignatureChanges = tree.match
548556
case tree: DefDef =>
549557
tree.paramss.nestedExists:
550-
case param: ValDef => param.tpt.hasNuType
551-
case param: TypeDef => param.rhs.hasNuType
558+
case param: ValDef => paramSigChange.contains(param.tpt)
559+
case param: TypeDef => paramSigChange.contains(param.rhs)
552560
case _ => false
553561

554562
// A symbol's signature changes if some of its parameter types or its result type
@@ -583,7 +591,7 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
583591
mt.paramInfos
584592
else
585593
val subst = SubstParams(psyms :: prevPsymss, mt1 :: prevLambdas)
586-
psyms.map(psym => adaptedInfo(psym, subst(psym.nextInfo).asInstanceOf[mt.PInfo])),
594+
psyms.map(psym => adaptedInfo(psym, subst(Fresh.toCap(psym.nextInfo)).asInstanceOf[mt.PInfo])),
587595
mt1 =>
588596
integrateRT(mt.resType, psymss.tail, resType, psyms :: prevPsymss, mt1 :: prevLambdas)
589597
)

0 commit comments

Comments
 (0)