Skip to content

Compiler hangs under -Wunused with Scala 3.7.0-RC1 #22812

Closed
@OndrejSpanel

Description

@OndrejSpanel

Compiler version

3.7.0-RC1
3.7.0-RC1-bin-20250312-3fe9304-NIGHTLY

Minimized code

I do not have any and I assume producing it would be very time consuming, given the nature of the problem.

Output (click arrow to expand)

When using recent 3.7 compiler on my project, the compiler is stuck forever, profiler shows function like dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context) to be called with deep nesting.

This must be a very recent regression. The same code compiles with 3.7.0-RC1-bin-20250309-2f639e2-NIGHTLY

dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase$MiniPhase.transformAllDeep(Trees$Tree, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.goInlined(Trees$Inlined, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(Trees$DefDef, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformNamed$1(Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$2(Symbols$Symbol, int, Contexts$Context, Trees$Block, ListBuffer, List, List, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformBlock(Trees$Block, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase$MiniPhase.transformAllDeep(Trees$Tree, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.goInlined(Trees$Inlined, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.mapDefDef$1(Trees$DefDef, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformNamed$1(Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$2(Symbols$Symbol, int, Contexts$Context, Trees$Block, ListBuffer, List, List, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformBlock(Trees$Block, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$3(int, Contexts$Context, ListBuffer, List, List)
dotty.tools.dotc.transform.MegaPhase.transformTrees(List, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase$MiniPhase.transformAllDeep(Trees$Tree, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.goInlined(Trees$Inlined, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$2$$anonfun$1(List, int, Contexts$Context, Trees$Block, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$2(Symbols$Symbol, int, Contexts$Context, Trees$Block, ListBuffer, List, List, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformBlock(Trees$Block, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$3(int, Contexts$Context, ListBuffer, List, List)
dotty.tools.dotc.transform.MegaPhase.transformTrees(List, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase$MiniPhase.transformAllDeep(Trees$Tree, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.goInlined(Trees$Inlined, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.mapValDef$1(Trees$ValDef, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformNamed$1(Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$1(Symbols$Symbol, int, ListBuffer, List, List, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformStats(List, Symbols$Symbol, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformNamed$1(Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$1(Symbols$Symbol, int, ListBuffer, List, List, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformStats(List, Symbols$Symbol, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformNamed$1(Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.loop$1(Symbols$Symbol, int, ListBuffer, List, List, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformStats(List, Symbols$Symbol, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.mapPackage$1(Trees$PackageDef, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnnamed$1(Contexts$Context, Trees$Tree, Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformTree(Trees$Tree, int, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.transformUnit(Trees$Tree, Contexts$Context)
dotty.tools.dotc.transform.MegaPhase.run(Contexts$Context)
dotty.tools.dotc.transform.MegaPhase$MiniPhase.run(Contexts$Context)
dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Contexts$Context, boolean, Builder, CompilationUnit)
scala.runtime.function.JProcedure1.apply(Object)
scala.runtime.function.JProcedure1.apply(Object)
scala.collection.immutable.List.foreach(Function1)
dotty.tools.dotc.core.Phases$Phase.runOn(List, Contexts$Context)
dotty.tools.dotc.Run.runPhases$1$$anonfun$1(Contexts$Context, ObjectRef, Profiler, ObjectRef, BooleanRef, Phases$Phase)
scala.runtime.function.JProcedure1.apply(Object)
scala.runtime.function.JProcedure1.apply(Object)
scala.collection.ArrayOps$.foreach$extension(Object, Function1)
dotty.tools.dotc.Run.runPhases$1(List, Phases$Phase[], Contexts$Context)
dotty.tools.dotc.Run.compileUnits$$anonfun$1$$anonfun$2(Phases$Phase[], Contexts$FreshContext, List)
dotty.tools.dotc.Run.compileUnits$$anonfun$1$$anonfun$adapted$1(Phases$Phase[], Contexts$FreshContext, List)
scala.Function0.apply$mcV$sp()
dotty.tools.dotc.Run.showProgress(Function0, Contexts$Context)
dotty.tools.dotc.Run.compileUnits$$anonfun$1(Contexts$Context)
dotty.tools.dotc.Run.compileUnits$$anonfun$adapted$1(Contexts$Context)
dotty.tools.dotc.util.Stats$.maybeMonitored(Function0, Contexts$Context)
dotty.tools.dotc.Run.compileUnits(Contexts$Context)
dotty.tools.dotc.Run.compileSources(List)
dotty.tools.dotc.Run.compile(List)
dotty.tools.dotc.Driver.doCompile(Compiler, List, Contexts$Context)
dotty.tools.xsbt.CompilerBridgeDriver.run(VirtualFile[], AnalysisCallback, Logger, Reporter, CompileProgress)
dotty.tools.xsbt.CompilerBridge.run(VirtualFile[], DependencyChanges, String[], Output, AnalysisCallback, Reporter, CompileProgress, Logger)
sbt.internal.inc.AnalyzingCompiler.compile(VirtualFile[], VirtualFile[], FileConverter, DependencyChanges, String[], Output, AnalysisCallback, Reporter, Optional, Logger)
sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler, Seq, Vector, DependencyChanges, String[], Output, AnalysisCallback)
scala.runtime.java8.JFunction0$mcV$sp.apply()
sbt.internal.inc.MixedAnalyzingCompiler.timed(String, Logger, Function0)
sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler, Seq, Seq, boolean, DependencyChanges, String[], Output, AnalysisCallback, Seq)
sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler, Seq, Seq, boolean, DependencyChanges, String[], Output, AnalysisCallback, Seq)
sbt.internal.inc.JarUtils$.withPreviousJar(Output, Function1)
sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(Seq, boolean, AnalysisCallback, Output, Seq, DependencyChanges)
sbt.internal.inc.MixedAnalyzingCompiler.compile(Set, DependencyChanges, AnalysisCallback, ClassFileManager)
sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(MixedAnalyzingCompiler, Set, DependencyChanges, AnalysisCallback, ClassFileManager)
sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(MixedAnalyzingCompiler, Set, DependencyChanges, AnalysisCallback, ClassFileManager)
sbt.internal.inc.Incremental$.$anonfun$apply$3(Function4, AdaptedRunProfiler, Set, DependencyChanges, AnalysisCallback, ClassFileManager)
sbt.internal.inc.Incremental$.$anonfun$apply$3$adapted(Function4, AdaptedRunProfiler, Set, DependencyChanges, AnalysisCallback, ClassFileManager)
sbt.internal.inc.Incremental$$anon$2.run(Set, DependencyChanges, Incremental$IncrementalCallback)
sbt.internal.inc.IncrementalCommon$CycleState.next()
sbt.internal.inc.IncrementalCommon$$anon$1.next()
sbt.internal.inc.IncrementalCommon$$anon$1.next()
sbt.internal.inc.IncrementalCommon.cycle(Set, Set, Set, FileConverter, DependencyChanges, ExternalLookup, Analysis, Incremental$CompileCycle, ClassFileManager, Output, int)
sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(boolean, IncrementalCommon, Set, Set, Set, FileConverter, DependencyChanges, Lookup, Analysis, Function4, AnalysisCallback$Builder, Output, boolean, InitialChanges, Option, Option, Logger, ClassFileManager)
sbt.internal.inc.Incremental$.withClassfileManager(IncOptions, FileConverter, Output, JarUtils$OutputJarContent, Function1)
sbt.internal.inc.Incremental$.incrementalCompile(Set, FileConverter, Lookup, CompileAnalysis, ReadStamps, Function4, AnalysisCallback$Builder, IncrementalCommon, IncOptions, MiniSetup, Output, JarUtils$OutputJarContent, Option, Option, Logger, Equiv)
sbt.internal.inc.Incremental$.apply(Set, FileConverter, Lookup, CompileAnalysis, IncOptions, MiniSetup, ReadStamps, Output, JarUtils$OutputJarContent, Option, Option, Option, Logger, Function4)
sbt.internal.inc.IncrementalCompilerImpl.compileInternal(MixedAnalyzingCompiler)
sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl, Option, Seq, Output, Option, Seq, FileConverter, ScalaCompiler, JavaCompiler, boolean, GlobalsCache, Option, Seq, Seq, Option, PerClasspathEntryLookup, Reporter, CompileOrder, boolean, IncOptions, Option, ReadStamps, List, Option, Logger)
sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(int, Output, Logger, Function0)
sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(ScalaCompiler, JavaCompiler, Seq, Seq, Output, Option, Option, GlobalsCache, Option, Seq, Seq, Option, Option, PerClasspathEntryLookup, Reporter, CompileOrder, boolean, boolean, IncOptions, Option, List, FileConverter, ReadStamps, Logger)
sbt.internal.inc.IncrementalCompilerImpl.compile(Inputs, Logger)
sbt.Defaults$.compileIncrementalTaskImpl(BspCompileTask, TaskStreams, Inputs, PromiseWrap, BuildServerReporter)
sbt.Defaults$.$anonfun$compileIncrementalTask$2(TaskStreams, Inputs, PromiseWrap, BuildServerReporter, BspCompileTask)
sbt.internal.server.BspCompileTask$.$anonfun$compute$1(Function1, BspCompileTask)
sbt.internal.io.Retry$.apply(Function0, int, long, Seq)
sbt.internal.io.Retry$.apply(Function0, int, Seq)
sbt.internal.io.Retry$.apply(Function0, Seq)
sbt.internal.server.BspCompileTask$.compute(BuildTargetIdentifier, ProjectRef, Configuration, Inputs, Function1)
sbt.Defaults$.$anonfun$compileIncrementalTask$1(Tuple7)
scala.Function1.$anonfun$compose$1(Function1, Function1, Object)
sbt.internal.util.$tilde$greater.$anonfun$$u2219$1($tilde$greater, Predef$$less$colon$less, Function1, Object)
sbt.std.Transform$$anon$4.work(Object)
sbt.Execute.$anonfun$submit$2(Node, Object)
sbt.internal.util.ErrorHandling$.wideConvert(Function0)
sbt.Execute.work(Object, Function0, CompletionService)
sbt.Execute.$anonfun$submit$1(Execute, Object, Node, Object, CompletionService)
sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions$$anon$4, Function0, Object)
sbt.CompletionService$$anon$2.call()
java.util.concurrent.FutureTask.run()
java.util.concurrent.Executors$RunnableAdapter.call()
java.util.concurrent.FutureTask.run()
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)
java.util.concurrent.ThreadPoolExecutor$Worker.run()
java.lang.Thread.runWith(Object, Runnable)
java.lang.Thread.run()

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions