refined icon indicating copy to clipboard operation
refined copied to clipboard

Scalac crashes if a Validate.Plain requires an implicit TypeTag

Open Atry opened this issue 7 years ago • 3 comments

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"
                                                         ^

Atry avatar Dec 14 '16 03:12 Atry

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?

fthomas avatar Dec 15 '16 20:12 fthomas

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

Atry avatar Dec 16 '16 01:12 Atry

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.

fthomas avatar Mar 15 '17 04:03 fthomas