fthomas / refined

Refinement types for Scala
MIT License
1.71k stars 154 forks source link

Scalac crashes if a Validate.Plain requires an implicit TypeTag #231

Open Atry opened 7 years ago

Atry commented 7 years ago
import eu.timepit.refined.auto._
import eu.timepit.refined.api.Validate
import shapeless.tag.@@

final case class CrashOnTypeTag[A]()

object CrashOnTypeTag {
  implicit def crashValidate[A: reflect.runtime.universe.TypeTag]: Validate.Plain[String, CrashOnTypeTag[A]] = {
    Validate.fromPredicate({ tree =>
      true
    }, { tree =>
      "check failed"
    }, CrashOnTypeTag[A]())
  }

  def main(args: Array[String]): Unit = {
    val crash: String @@ CrashOnTypeTag[Int => String] = "function"
  }

}
CrashOnTypeTag.scala:19: exception during macro expansion: 
java.lang.ClassNotFoundException: CrashOnTypeTag$
    at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:62)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at __wrapper$3$b49909639286418ab9615ff443755b07.__wrapper$3$b49909639286418ab9615ff443755b07$.wrapper(<no source file>:19)
    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 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal$$anonfun$compile$1.apply(ToolBoxFactory.scala:275)
    at scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.eval(ToolBoxFactory.scala:444)
    at scala.reflect.macros.contexts.Evals$class.eval(Evals.scala:20)
    at scala.reflect.macros.contexts.Context.eval(Context.scala:6)
    at eu.timepit.refined.macros.MacroUtils$$anonfun$eval$1.apply(MacroUtils.scala:20)
    at scala.Option.getOrElse(Option.scala:121)
    at eu.timepit.refined.macros.MacroUtils$class.tryN(MacroUtils.scala:24)
    at eu.timepit.refined.macros.RefineMacro.tryN(RefineMacro.scala:9)
    at eu.timepit.refined.macros.MacroUtils$class.eval(MacroUtils.scala:20)
    at eu.timepit.refined.macros.RefineMacro.eval(RefineMacro.scala:9)
    at eu.timepit.refined.macros.RefineMacro.impl(RefineMacro.scala:23)
    val crash: String @@ CrashOnTypeTag[Int => String] = "function"
                                                         ^
fthomas commented 7 years ago

Interesting. :-) I guess it does not depend on the supplied type parameter to CrashOnTypeTag? Do you have a specific use case in mind for a Validate instance that takes a TypeTag?

Atry commented 7 years ago

The type parameter matters. String @@ CrashOnTypeTag[Int => String] crashes while String @@ CrashOnTypeTag[String] does not crash.

fthomas commented 7 years ago

That is strange. #266 shows that CrashOnTypeTag[String] also crashes with Scala 2.12. I also tested with 2.11 locally and got the same result.