Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
OndrejSpanel opened this issue Mar 15, 2025 · 7 comments · Fixed by #22815
Closed

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

OndrejSpanel opened this issue Mar 15, 2025 · 7 comments · Fixed by #22815
Assignees
Labels
area:linting Linting warnings enabled with -W or -Xlint itype:bug itype:compiler hangs Issues where the compiler hangs. itype:crash regression This worked in a previous version but doesn't anymore stat:needs minimization Needs a self contained minimization

Comments

@OndrejSpanel
Copy link
Member

OndrejSpanel commented Mar 15, 2025

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()
@OndrejSpanel OndrejSpanel added itype:bug itype:crash stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 15, 2025
@som-snytt
Copy link
Contributor

I'll take a look at

dotty.tools.dotc.transform.CheckUnused.transformInlined(Trees$Inlined, Contexts$Context)

The workaround is turning off -Wunused.

@OndrejSpanel
Copy link
Member Author

OndrejSpanel commented Mar 15, 2025

The workaround is turning off -Wunused.

For information: currently I use in my project "-Wunused:imports". I confirm that when removed the project can be compiled without freezing.

@som-snytt
Copy link
Contributor

@OndrejSpanel Is it a public project that I can try?

@OndrejSpanel
Copy link
Member Author

No, am sorry, it is not. It is quite complex project, ~500 Scala sources, proprietary sources.

@mio-19
Copy link

mio-19 commented Mar 15, 2025

me too. complex project long scala sources

You can try with compiler subproject commit https://github.com/chester-lang/chester/tree/5c90d7f86920459e80641465f48738844c8f5309
use sbt 'bumpScala 3.7.0-RC1' at root to change scala version

@som-snytt
Copy link
Contributor

Confirmed the linked revert lets the example project proceed.

@Gedochao Gedochao added stat:needs minimization Needs a self contained minimization regression This worked in a previous version but doesn't anymore area:linting Linting warnings enabled with -W or -Xlint itype:compiler hangs Issues where the compiler hangs. and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 17, 2025
@som-snytt som-snytt marked this as a duplicate of #22829 Mar 18, 2025
@som-snytt som-snytt changed the title Compiler freezes when compiling with Scala 3.7.0-RC1 Compiler hangs under -Wunused with Scala 3.7.0-RC1 Mar 18, 2025
@som-snytt
Copy link
Contributor

This has to with linting inlined code; the revert just removes the tweak that recurses into inlined trees.

jchyb added a commit that referenced this issue Mar 23, 2025
The tweak to lint Inlined is reverted, on suspicion that it is the root
cause of #22812 . (Investigation ongoing.) (If it reverts without a test
change, then it doesn't have test coverage.)

Gather legacy tests about type parameters and delete the `untried` test
files. Same for `unused` test files; removing check and flags files for
`warn-unused-privates` is a follow-up chore for a previous PR.

Fixes #22812
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:linting Linting warnings enabled with -W or -Xlint itype:bug itype:compiler hangs Issues where the compiler hangs. itype:crash regression This worked in a previous version but doesn't anymore stat:needs minimization Needs a self contained minimization
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants