Skip to content

Regression when compiling scala 2 macro bundle #11415

Closed
@bishabosha

Description

@bishabosha

This affects the compatibility story for Scala 2 macros, as we can not compile a macro that references a macro bundle

Compiler version

3.0.0-M4-bin-20210214-80befc3-NIGHTLY

Minimized code

package example

import scala.language.experimental.macros

trait Context {

  val universe: Universe

  trait Universe {
    type Tree >: Null <: AnyRef with TreeApi
    type Literal >: Null <: LiteralApi with TermTree
    type TermTree >: Null <: TermTreeApi with Tree

    trait TermTreeApi extends TreeApi { this: TermTree => }
    trait LiteralApi extends TermTreeApi { this: Literal => }
    trait TreeApi extends Product { this: Tree => }
  }
}

object MacroCompat {

  object Bundles {
    def mono: Int = macro Macros2.MacroImpl.mono
    inline def mono: Int = ${ Macros3.monoImpl }
  }

  object Macros2 {
    class MacroImpl(val c: Context) {
      import c.universe._

      def mono: Literal = ???
    }
  }

  object Macros3 {
    import quoted._

    def monoImpl(using Quotes) = '{1}

  }

}

Output (click arrow to expand)

exception occurred while typechecking sandbox/macros/example.scala
exception occurred while compiling sandbox/macros/example.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: example.Context#Universe#LiteralApi &  >: Null <: bundle$1.c.universe.TermTreeApi & bundle$1.c.universe.Tree / TypeRef(TypeRef(TypeRef(ThisType(TypeRef(NoPrefix,module class example)),trait Context),trait Universe),trait LiteralApi) & TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Null),AndType(TypeRef(TermRef(TermRef(TermRef(NoPrefix,val bundle$1),val c),val universe),trait TermTreeApi),TypeRef(TermRef(TermRef(TermRef(NoPrefix,val bundle$1),val c),val universe),type Tree)))
	at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:8)
	at dotty.tools.dotc.core.Types$AndType$.apply(Types.scala:3060)
	at dotty.tools.dotc.core.Types$AndType$.make(Types.scala:3078)
	at dotty.tools.dotc.core.Types$AndType.derivedAndType(Types.scala:3041)
	at dotty.tools.dotc.core.Types$ApproximatingTypeMap.derivedAndType(Types.scala:5504)
	at dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:5225)
	at dotty.tools.dotc.core.TypeOps$$anon$1.apply(TypeOps.scala:444)
	at dotty.tools.dotc.core.Types$ApproximatingTypeMap.reapply(Types.scala:5552)
	at dotty.tools.dotc.core.Types$ApproximatingTypeMap.expandBounds(Types.scala:5350)
	at dotty.tools.dotc.core.Types$ApproximatingTypeMap.tryWiden(Types.scala:5369)
	at dotty.tools.dotc.core.TypeOps$$anon$1.derivedSelect(TypeOps.scala:459)
	at dotty.tools.dotc.core.Types$TypeMap.mapOver(Types.scala:5162)
	at dotty.tools.dotc.core.TypeOps$$anon$1.apply(TypeOps.scala:444)
	at dotty.tools.dotc.core.TypeOps$$anon$1.apply(TypeOps.scala:419)
	at dotty.tools.dotc.core.TypeOps$.avoid(TypeOps.scala:469)
	at dotty.tools.dotc.typer.TypeAssigner.avoidingType(TypeAssigner.scala:44)
	at dotty.tools.dotc.typer.TypeAssigner.avoidingType$(TypeAssigner.scala:20)
	at dotty.tools.dotc.typer.Typer.avoidingType(Typer.scala:102)
	at dotty.tools.dotc.typer.TypeAssigner.assignType(TypeAssigner.scala:368)
	at dotty.tools.dotc.typer.TypeAssigner.assignType$(TypeAssigner.scala:20)
	at dotty.tools.dotc.typer.Typer.assignType(Typer.scala:102)
	at dotty.tools.dotc.ast.tpd$.Block(tpd.scala:78)
	at dotty.tools.dotc.typer.Typer.typedPrefix$3$$anonfun$2(Typer.scala:3809)
	at dotty.tools.dotc.typer.Typer.tryAlternatively$$anonfun$3$$anonfun$1(Typer.scala:2865)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:2848)
	at dotty.tools.dotc.typer.Typer.tryAlternatively$$anonfun$2(Typer.scala:2868)
	at dotty.tools.dotc.typer.Typer.tryEither(Typer.scala:2851)
	at dotty.tools.dotc.typer.Typer.tryAlternatively(Typer.scala:2869)
	at dotty.tools.dotc.typer.Typer.typedPrefix$1(Typer.scala:3810)
	at dotty.tools.dotc.typer.Typer.typedScala2MacroBody(Typer.scala:3830)
	at dotty.tools.dotc.typer.Typer.$anonfun$35(Typer.scala:2079)
	at dotty.tools.dotc.typer.PrepareInlineable$.dropInlineIfError(PrepareInlineable.scala:223)
	at dotty.tools.dotc.typer.Typer.typedDefDef(Typer.scala:2080)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2570)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2654)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2720)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2724)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2746)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2796)
	at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2226)
	at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2581)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2585)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2654)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2720)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2724)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2746)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2796)
	at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2226)
	at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2581)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2585)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2654)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2720)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2724)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2746)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2796)
	at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2378)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2626)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2655)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2720)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2724)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2840)
	at dotty.tools.dotc.typer.FrontEnd.liftedTree1$1(FrontEnd.scala:79)
	at dotty.tools.dotc.typer.FrontEnd.typeCheck$$anonfun$1(FrontEnd.scala:84)
	at dotty.tools.dotc.typer.FrontEnd.monitor(FrontEnd.scala:43)
	at dotty.tools.dotc.typer.FrontEnd.typeCheck(FrontEnd.scala:85)
	at dotty.tools.dotc.typer.FrontEnd.runOn$$anonfun$3(FrontEnd.scala:120)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.immutable.List.foreach(List.scala:333)
	at dotty.tools.dotc.typer.FrontEnd.runOn(FrontEnd.scala:120)
	at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:205)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at scala.runtime.function.JProcedure1.apply(JProcedure1.java:10)
	at scala.collection.ArrayOps$.foreach$extension(ArrayOps.scala:1323)
	at dotty.tools.dotc.Run.runPhases$5(Run.scala:215)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:223)
	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:230)
	at dotty.tools.dotc.Run.compileSources(Run.scala:166)
	at dotty.tools.dotc.Run.compile(Run.scala:150)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:39)
	at dotty.tools.dotc.Driver.process(Driver.scala:186)
	at dotty.tools.dotc.Driver.process(Driver.scala:155)
	at dotty.tools.dotc.Driver.process(Driver.scala:167)
	at dotty.tools.dotc.Driver.main(Driver.scala:194)
	at dotty.tools.dotc.Main.main(Main.scala)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions