Skip to content

Commit 4f4e373

Browse files
Merge pull request #2025 from dotty-staging/fix-2024
Fix #2024: TypeApply can be a final apply of a recursive method.
2 parents 586113d + 176f40a commit 4f4e373

File tree

5 files changed

+25
-8
lines changed

5 files changed

+25
-8
lines changed

compiler/src/dotty/tools/backend/jvm/GenBCode.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package dotty.tools.backend.jvm
22

33
import dotty.tools.dotc.CompilationUnit
4-
import dotty.tools.dotc.ast.Trees.{ValDef, PackageDef}
4+
import dotty.tools.dotc.ast.Trees.{PackageDef, ValDef}
55
import dotty.tools.dotc.ast.tpd
66
import dotty.tools.dotc.core.Phases.Phase
77
import dotty.tools.dotc.core.Names.TypeName
88

99
import scala.collection.mutable
10-
import scala.tools.asm.{CustomAttr, ClassVisitor, MethodVisitor, FieldVisitor}
10+
import scala.tools.asm.{ClassVisitor, CustomAttr, FieldVisitor, MethodVisitor}
1111
import scala.tools.nsc.Settings
1212
import scala.tools.nsc.backend.jvm._
1313
import dotty.tools.dotc
1414
import dotty.tools.dotc.backend.jvm.DottyPrimitives
1515
import dotty.tools.dotc.transform.Erasure
16-
1716
import dotty.tools.dotc.interfaces
1817
import java.util.Optional
1918

@@ -27,14 +26,15 @@ import Symbols._
2726
import Denotations._
2827
import Phases._
2928
import java.lang.AssertionError
30-
import java.io.{ File => JFile }
29+
import java.io.{FileOutputStream, File => JFile}
30+
3131
import scala.tools.asm
3232
import scala.tools.asm.tree._
33-
import dotty.tools.dotc.util.{Positions, DotClass}
33+
import dotty.tools.dotc.util.{DotClass, Positions}
3434
import tpd._
3535
import StdNames._
36-
import scala.reflect.io.{Directory, PlainDirectory, AbstractFile}
3736

37+
import scala.reflect.io.{AbstractFile, Directory, PlainDirectory}
3838
import scala.tools.nsc.backend.jvm.opt.LocalOpt
3939

4040
class GenBCode extends Phase {
@@ -205,7 +205,15 @@ class GenBCodePipeline(val entryPoints: List[Symbol], val int: DottyBackendInter
205205
if (claszSymbol.isClass) // @DarkDimius is this test needed here?
206206
for (binary <- ctx.compilationUnit.pickled.get(claszSymbol.asClass)) {
207207
val dataAttr = new CustomAttr(nme.TASTYATTR.toString, binary)
208-
(if (mirrorC ne null) mirrorC else plainC).visitAttribute(dataAttr)
208+
val store = if (mirrorC ne null) mirrorC else plainC
209+
store.visitAttribute(dataAttr)
210+
if (ctx.settings.emitTasty.value) {
211+
val outTastyFile = getFileForClassfile(outF, store.name, ".tasty").file
212+
val fos = new FileOutputStream(outTastyFile, false)
213+
fos.write(binary)
214+
fos.close()
215+
216+
}
209217
}
210218

211219
// -------------- bean info class, if needed --------------

compiler/src/dotty/tools/dotc/config/ScalaSettings.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class ScalaSettings extends Settings.SettingGroup {
7171
val debugOwners = BooleanSetting("-Ydebug-owners", "Print all owners of definitions (requires -Yprint-syms)")
7272
val termConflict = ChoiceSetting("-Yresolve-term-conflict", "strategy", "Resolve term conflicts", List("package", "object", "error"), "error")
7373
val log = PhasesSetting("-Ylog", "Log operations during")
74+
val emitTasty = BooleanSetting("-YemitTasty", "Generate tasty in separate *.tasty file.")
7475
val Ylogcp = BooleanSetting("-Ylog-classpath", "Output information about what classpath is being applied.")
7576
val YnoImports = BooleanSetting("-Yno-imports", "Compile without importing scala.*, java.lang.*, or Predef.")
7677
val YnoPredef = BooleanSetting("-Yno-predef", "Compile without importing Predef.")

compiler/src/dotty/tools/dotc/transform/TailRec.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,10 @@ class TailRec extends MiniPhaseTransform with DenotTransformer with FullParamete
325325
else
326326
rewriteApply(tree, meth)
327327

328+
case TypeApply(fun, targs) =>
329+
val meth = fun.symbol
330+
rewriteApply(tree, meth)
331+
328332
case tree@Block(stats, expr) =>
329333
tpd.cpy.Block(tree)(
330334
noTailTransforms(stats),

tests/pos/tailcall/i2024.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
object Test {
2+
// def main(args: Array[String]): Unit = { }
3+
def assume[T]: Any = assume
4+
}

tests/pos/tailcall/return.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
object Test {
1+
object Return {
22

33
def foo(x: Int): Int = return 3
44

0 commit comments

Comments
 (0)