Skip to content

Compiler crash during macro expansion #5715

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

Closed
liufengyun opened this issue Jan 15, 2019 · 0 comments
Closed

Compiler crash during macro expansion #5715

liufengyun opened this issue Jan 15, 2019 · 0 comments

Comments

@liufengyun
Copy link
Contributor

liufengyun commented Jan 15, 2019

The following code crashes the Splicer:

// assert_1.scala

import scala.quoted._
import scala.tasty._

object scalatest {

  inline def assert(condition: => Boolean): Unit = ~assertImpl('(condition), '(""))

  def assertImpl(cond: Expr[Boolean], clue: Expr[Any])(implicit refl: Reflection): Expr[Unit] = {
    import refl._
    import quoted.Toolbox.Default._

    cond.unseal.underlyingArgument match {
      case Term.Apply(sel @ Term.Select(lhs, op), rhs :: Nil) =>
        val Term.IsSelect(select) = sel
        val cond = Term.Apply(Term.Select.copy(select)(lhs, ">"), rhs :: Nil).seal[Boolean]
        '{ scala.Predef.assert(~cond) }
      case _ =>
        '{ scala.Predef.assert(~cond) }
    }
  }
}

And test code:

object Test {
  import scalatest._

  def main(args: Array[String]): Unit = {
    val l = List(3, 4)
    assert(l.exists(_ == 3))
  }
}
show log
-- Error: tests/run/reflect-select-copy/test_2.scala:6:10 ----------------------
6 |    assert(l.exists(_ == 3))
  |    ^^^^^^^^^^^^^^^^^^^^^^^^
  |An exception occurred while executing macro expansion
  |assertion failed: invalid prefix NoType
  |java.lang.AssertionError: assertion failed: invalid prefix NoType
  |	at scala.Predef$.assert(Predef.scala:223)
  |	at dotty.tools.dotc.core.Types$NamedType.(Types.scala:1687)
  |	at dotty.tools.dotc.core.Types$TermRef.(Types.scala:2205)
  |	at dotty.tools.dotc.core.Types$CachedTermRef.(Types.scala:2257)
  |	at dotty.tools.dotc.core.Uniques$NamedTypeUniques.newType$1(Uniques.scala:60)
  |	at dotty.tools.dotc.core.Uniques$NamedTypeUniques.enterIfNew(Uniques.scala:65)
  |	at dotty.tools.dotc.core.Types$TermRef$.apply(Types.scala:2305)
  |	at dotty.tools.dotc.core.Types$TermRef$.apply(Types.scala:2311)
  |	at dotty.tools.dotc.core.Types$NamedType$.apply(Types.scala:2297)
  |	at dotty.tools.dotc.core.Types$NamedType.reload$1(Types.scala:2155)
  |	at dotty.tools.dotc.core.Types$NamedType.withPrefix(Types.scala:2162)
  |	at dotty.tools.dotc.core.Types$NamedType.derivedSelect(Types.scala:2103)
  |	at dotty.tools.dotc.ast.tpd$TypedTreeCopier.Select(tpd.scala:531)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1217)
  |	at dotty.tools.dotc.ast.tpd$MapToUnderlying.transform(tpd.scala:975)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1223)
  |	at dotty.tools.dotc.ast.tpd$MapToUnderlying.transform(tpd.scala:975)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1294)
  |	at dotty.tools.dotc.ast.tpd$MapToUnderlying.transform(tpd.scala:975)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.$anonfun$transform$6(Trees.scala:1317)
  |	at scala.collection.immutable.List.mapConserve(List.scala:179)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1317)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1315)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1237)
  |	at dotty.tools.dotc.ast.tpd$MapToUnderlying.transform(tpd.scala:975)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.$anonfun$transform$6(Trees.scala:1317)
  |	at scala.collection.immutable.List.mapConserve(List.scala:179)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1317)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1223)
  |	at dotty.tools.dotc.ast.tpd$MapToUnderlying.transform(tpd.scala:975)
  |	at dotty.tools.dotc.ast.tpd$MapToUnderlying.transform(tpd.scala:972)
  |	at dotty.tools.dotc.ast.tpd$TreeOps$.underlyingArgument$extension(tpd.scala:930)
  |	at dotty.tools.dotc.tastyreflect.TreeOpsImpl$$anon$31.underlyingArgument(TreeOpsImpl.scala:358)
  |	at dotty.tools.dotc.tastyreflect.TreeOpsImpl$$anon$31.underlyingArgument(TreeOpsImpl.scala:354)
  |	at scalatest$.assertImpl(assert_1.scala:12)
  |	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  |	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  |	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  |	at java.lang.reflect.Method.invoke(Method.java:498)
  |	at dotty.tools.dotc.transform.Splicer$Interpreter.$anonfun$interpretStaticMethodCall$1(Splicer.scala:132)
  |	at dotty.tools.dotc.transform.Splicer$Interpreter.stopIfRuntimeException(Splicer.scala:185)
  |	at dotty.tools.dotc.transform.Splicer$Interpreter.interpretStaticMethodCall(Splicer.scala:132)
  |	at dotty.tools.dotc.transform.Splicer$AbstractInterpreter.interpretTree(Splicer.scala:333)
  |	at dotty.tools.dotc.transform.Splicer$Interpreter.interpret(Splicer.scala:83)
  |	at dotty.tools.dotc.transform.Splicer$.splice(Splicer.scala:44)
  |	at dotty.tools.dotc.transform.Staging$Reifier.splice(Staging.scala:452)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:581)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1231)
  |	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:62)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:83)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:625)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1257)
  |	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:62)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:83)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:625)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1237)
  |	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:62)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:73)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:590)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:81)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:625)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.traverse$1(MacroTransformWithImplicits.scala:50)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transformStats(MacroTransformWithImplicits.scala:57)
  |	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:60)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:83)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:625)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1297)
  |	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:54)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:83)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:625)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.$anonfun$transform$6(Trees.scala:1317)
  |	at scala.collection.immutable.List.mapConserve(List.scala:179)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1317)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1315)
  |	at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1303)
  |	at dotty.tools.dotc.transform.MacroTransform$Transformer.transform(MacroTransform.scala:54)
  |	at dotty.tools.dotc.transform.MacroTransformWithImplicits$ImplicitsTransformer.transform(MacroTransformWithImplicits.scala:83)
  |	at dotty.tools.dotc.transform.Staging$Reifier.super$transform(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.mapOverTree$1(Staging.scala:568)
  |	at dotty.tools.dotc.transform.Staging$Reifier.$anonfun$transform$2(Staging.scala:625)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:40)
  |	at dotty.tools.dotc.reporting.trace$.apply(trace.scala:48)
  |	at dotty.tools.dotc.transform.Staging$Reifier.transform(Staging.scala:566)
  |	at dotty.tools.dotc.transform.MacroTransform.run(MacroTransform.scala:21)
  |	at dotty.tools.dotc.transform.Staging.run(Staging.scala:92)
  |	at dotty.tools.dotc.core.Phases$Phase.$anonfun$runOn$1(Phases.scala:297)
  |	at scala.collection.immutable.List.map(List.scala:286)
  |	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:295)
  |	at dotty.tools.dotc.Run.$anonfun$compileUnits$3(Run.scala:172)
  |	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
  |	at dotty.tools.dotc.util.Stats$.trackTime(Stats.scala:49)
  |	at dotty.tools.dotc.Run.$anonfun$compileUnits$2(Run.scala:169)
  |	at dotty.tools.dotc.Run.$anonfun$compileUnits$2$adapted(Run.scala:167)
  |	at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
  |	at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
  |	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
  |	at dotty.tools.dotc.Run.runPhases$1(Run.scala:167)
  |	at dotty.tools.dotc.Run.$anonfun$compileUnits$1(Run.scala:192)
  |	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
  |	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:90)
  |	at dotty.tools.dotc.Run.compileUnits(Run.scala:147)
  |	at dotty.tools.dotc.Run.compileSources(Run.scala:134)
  |	at dotty.tools.dotc.Run.compile(Run.scala:118)
  |	at dotty.tools.dotc.Driver.doCompile(Driver.scala:33)
  |	at dotty.tools.dotc.Driver.process(Driver.scala:166)
  |	at dotty.tools.dotc.Driver.process(Driver.scala:135)
  |	at dotty.tools.dotc.Driver.process(Driver.scala:147)
  |	at dotty.tools.dotc.Driver.main(Driver.scala:174)
  |	at dotty.tools.dotc.Main.main(Main.scala)
  |
one error found
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants