Skip to content

Commit e6ceff9

Browse files
committed
Fix: Use cap instead of Fresh.Cap for parameter types of methods
1 parent 27f2a1a commit e6ceff9

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
@@ -427,15 +427,20 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
427427
def setupTraverser(checker: CheckerAPI) = new TreeTraverserWithPreciseImportContexts:
428428
import checker.*
429429

430+
private val paramSigChange = util.EqHashSet[Tree]()
431+
430432
/** Transform type of tree, and remember the transformed type as the type the tree */
431433
private def transformTT(tree: TypeTree, sym: Symbol, boxed: Boolean)(using Context): Unit =
432434
if !tree.hasNuType then
433-
val transformed =
435+
var transformed =
434436
if tree.isInferred
435437
then transformInferredType(tree.tpe)
436438
else transformExplicitType(tree.tpe, tptToCheck = tree)
439+
if boxed then transformed = box(transformed)
440+
if sym.is(Param) && (transformed ne tree.tpe) then
441+
paramSigChange += tree
437442
tree.setNuType(
438-
if boxed then box(transformed) else Fresh.fromCap(transformed, sym))
443+
if boxed then transformed else Fresh.fromCap(transformed, sym))
439444

440445
/** Transform the type of a val or var or the result type of a def */
441446
def transformResultType(tpt: TypeTree, sym: Symbol)(using Context): Unit =
@@ -501,6 +506,9 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
501506
inContext(ctx.withOwner(sym))
502507
traverseChildren(tree)
503508

509+
case tree @ TypeDef(_, rhs: TypeTree) =>
510+
transformTT(rhs, tree.symbol, boxed = false)
511+
504512
case tree @ SeqLiteral(elems, tpt: TypeTree) =>
505513
traverse(elems)
506514
tpt.setNuType(box(transformInferredType(tpt.tpe)))
@@ -544,8 +552,8 @@ class Setup extends PreRecheck, SymTransformer, SetupAPI:
544552
def paramSignatureChanges = tree.match
545553
case tree: DefDef =>
546554
tree.paramss.nestedExists:
547-
case param: ValDef => param.tpt.hasNuType
548-
case param: TypeDef => param.rhs.hasNuType
555+
case param: ValDef => paramSigChange.contains(param.tpt)
556+
case param: TypeDef => paramSigChange.contains(param.rhs)
549557
case _ => false
550558

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

0 commit comments

Comments
 (0)