Open
Description
Make some traits as
trait InvariantTrait[T]
trait ContravariantTrait[-T]
Then make some implicit macros that nominally create instances of those traits:
implicit def makeInvariantTrait[T]: InvariantTrait[T] = macro makeInvariantTraitImpl[T]
def makeInvariantTraitImpl[T](context: whitebox.Context)(implicit T: context.WeakTypeTag[T]): context.Tree = {
import context.universe._
context.error(context.enclosingPosition, s"$T")
EmptyTree
}
implicit def makeContravariantTrait[T]: ContravariantTrait[T] = macro makeContravariantTraitImpl[T]
def makeContravariantTraitImpl[T](context: whitebox.Context)(implicit T: context.WeakTypeTag[T]): context.Tree = {
import context.universe._
context.error(context.enclosingPosition, s"$T")
EmptyTree
}
Then use the macros
implicitly[InvariantTrait[Int]]
implicitly[ContravariantTrait[Int]]
And compile with -Xlog-implicits to see the problems.
In the invariant case, the error is
Information:(24, 13) makeInvariantTrait is not a valid implicit value for InvariantTrait[Int] because:
WeakTypeTag[Int]
implicitly[InvariantTrait[Int]]
^
In the contravariant case, the error is
Information:(24, 13) makeContravariantTrait is not a valid implicit value for ContravariantTrait[Int] because:
WeakTypeTag[Any]
implicitly[ContravariantTrait[Int]]
^