Skip to content

Commit 235c047

Browse files
committed
Refactor constant folding of applications
Move them in typedApply/typedTypeApply instead of leaving them until adapt. This aligns these folds with folds of uniary operations, which are done already in typedSelect and avoids potentially several calls to ConstFold when arguments are passed to overloaded methods.
1 parent c8c3bde commit 235c047

File tree

3 files changed

+13
-3
lines changed

3 files changed

+13
-3
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1124,12 +1124,13 @@ trait Applications extends Compatibility {
11241124
}
11251125
app
11261126
}
1127-
app1 match {
1127+
val app2 = app1 match {
11281128
case Apply(Block(stats, fn), args) =>
11291129
tpd.cpy.Block(app1)(stats, tpd.cpy.Apply(app1)(fn, args))
11301130
case _ =>
11311131
app1
11321132
}
1133+
ConstFold(app2)
11331134
}
11341135

11351136
/** Typecheck an Apply node with a typed function and possibly-typed arguments coming from `proto` */
@@ -1189,7 +1190,8 @@ trait Applications extends Compatibility {
11891190
case _ => tree.withType(TryDynamicCallType)
11901191
}
11911192
if (typedFn.tpe eq TryDynamicCallType) tryDynamicTypeApply()
1192-
else assignType(cpy.TypeApply(tree)(typedFn, typedArgs), typedFn, typedArgs)
1193+
else
1194+
ConstFold(assignType(cpy.TypeApply(tree)(typedFn, typedArgs), typedFn, typedArgs))
11931195
}
11941196
}
11951197

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4200,7 +4200,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
42004200

42014201
def adaptToSubType(wtp: Type): Tree =
42024202
// try converting a constant to the target type
4203-
ConstFold(tree).tpe.widenTermRefExpr.normalized match
4203+
tree.tpe.widenTermRefExpr.normalized match
42044204
case ConstantType(x) =>
42054205
val converted = x.convertTo(pt)
42064206
if converted != null && (converted ne x) then

tests/pos/constfold.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,12 @@ object Test extends App {
1515
Console.println(A.y);
1616
Console.println(A.z);
1717
Console.println(A.s);
18+
19+
def f(x: 12): Int = 1
20+
def f(x: Int): Double = 2
21+
val x = f(12)
22+
val _: Int = x
23+
val y = f(2 * 6)
24+
val _: Int = x
25+
1826
}

0 commit comments

Comments
 (0)