Closed
Description
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