Skip to content

Position.point on NoPosition when using: macro implicit, Wmacros:both and Xlint:unused #12895

Closed
scala/scala
#10710
@MateuszKubuszok

Description

@MateuszKubuszok

Reproduction steps

Scala version: I reproduced it on were 2.13.3 and 2.13.12.

//> using scala 2.13.3
//> using options -Wmacros:both -Xlint:unused
//> using javaOpt -Xss64m
//> using dep io.scalaland::chimney::0.8.0

import io.scalaland.chimney.dsl._

object ChimneyBug {
  private def handleEvent(state: State, event: Event) =
    (state, event) match {
      case (active: State.Active, updated: Event.A) =>
        active.patchUsing(updated)
    }

  sealed trait Event
  object Event {
    case class A(
                  a: String,
                ) extends Event
  }

  sealed trait State
  object State {
    case class Active(
                       a: String,
                     ) extends State
  }

  def test = handleEvent(ChimneyBug.State.Active("A"), ChimneyBug.Event.A("B"))
}

object Main {
  def main(args: Array[String]): Unit =
    println(ChimneyBug.test)
}

Problem

User reported that updating Chimney the newest version resulted in compilation errors. After discussion I managed to reproduce the error:

[error] ## Exception when compiling 1 sources to /Users/dev/Workspaces/GitHub/toescik2/dest/target/scala-2.13/classes
[error] java.lang.UnsupportedOperationException: Position.point on NoPosition
[error] scala.reflect.internal.util.Position.fail(Position.scala:24)
[error] scala.reflect.internal.util.UndefinedPosition.point(Position.scala:102)
[error] scala.reflect.internal.util.UndefinedPosition.point(Position.scala:97)
[error] scala.tools.nsc.typechecker.TypeDiagnostics$UnusedPrivates.sympos(TypeDiagnostics.scala:623)
[error] scala.tools.nsc.typechecker.TypeDiagnostics$UnusedPrivates.$anonfun$unusedParams$2(TypeDiagnostics.scala:642)
[error] scala.tools.nsc.typechecker.TypeDiagnostics$UnusedPrivates.$anonfun$unusedParams$2$adapted(TypeDiagnostics.scala:642)
[error] scala.math.Ordering$$anon$1.compare(Ordering.scala:140)
[error] java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
[error] java.base/java.util.TimSort.sort(TimSort.java:220)
[error] java.base/java.util.Arrays.sort(Arrays.java:1233)
[error] scala.collection.SeqOps.sorted(Seq.scala:705)
[error] scala.collection.SeqOps.sorted$(Seq.scala:697)
[error] scala.collection.immutable.List.scala$collection$immutable$StrictOptimizedSeqOps$$super$sorted(List.scala:79)
[error] scala.collection.immutable.StrictOptimizedSeqOps.sorted(StrictOptimizedSeqOps.scala:78)
[error] scala.collection.immutable.StrictOptimizedSeqOps.sorted$(StrictOptimizedSeqOps.scala:78)
[error] scala.collection.immutable.List.sorted(List.scala:79)
[error] scala.collection.SeqOps.sortBy(Seq.scala:759)
[error] scala.collection.SeqOps.sortBy$(Seq.scala:759)
[error] scala.collection.AbstractSeq.sortBy(Seq.scala:1154)
[error] scala.tools.nsc.typechecker.TypeDiagnostics$UnusedPrivates.unusedParams(TypeDiagnostics.scala:642)
[error] scala.tools.nsc.typechecker.TypeDiagnostics$checkUnused.run(TypeDiagnostics.scala:748)
[error] scala.tools.nsc.typechecker.TypeDiagnostics$checkUnused.apply(TypeDiagnostics.scala:759)
[error] scala.tools.nsc.typechecker.Analyzer$typerFactory$TyperPhase.apply(Analyzer.scala:123)
[error] scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:454)
[error] scala.tools.nsc.typechecker.Analyzer$typerFactory$TyperPhase.run(Analyzer.scala:105)
[error] scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1515)
[error] scala.tools.nsc.Global$Run.compileUnits(Global.scala:1499)
[error] scala.tools.nsc.Global$Run.compileSources(Global.scala:1491)
[error] scala.tools.nsc.Global$Run.compileFiles(Global.scala:1605)
[error] xsbt.CachedCompiler0.run(CompilerBridge.scala:163)
[error] xsbt.CachedCompiler0.run(CompilerBridge.scala:134)
[error] xsbt.CompilerBridge.run(CompilerBridge.scala:39)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:91)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:193)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:248)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:183)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:239)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:163)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:211)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:534)
...

Despite my best efforts I couldn't find any relation with what Chimney does, and this error. Using flags for debugging the compilation like -Xlog-implicits, -verbose, -Yquasiquote-debug, -Xprint-pos showed nothing, as if error happened before the macro expansion even started. Increasing stack with -Xss64m doesn't change the outcome.

It might be an error in Chimney, or it might be a particular combination of: an implicit provided by a macro, checking for unused definitions and putting macros into checking unused. Stack trace suggest that error happens in the typer while checking for unused private definitions. Removing any the the flags (-Wmacros:both, -Xlint:unused) makes the error disappear. That's why I created this ticket because I think that without a compiler developer's help I will not be able to tell if the bug is in Chimney or on the compiler.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions