Skip to content

Type tag passed to implicit macro of contravariant type is always Any #8802

Open
@scabug

Description

@scabug

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions