Skip to content

All quotes widen singleton types #9812

Closed
@bishabosha

Description

@bishabosha

Minimized code

// compile with -Ycheck:reifyQuotes -Ystop-after:reifyQuotes
import quoted._

sealed abstract class SomeEnum
object SomeEnum:
  final val Foo = new SomeEnum {}

def quoteFoo: QuoteContext ?=> Expr[SomeEnum.Foo.type] = '{SomeEnum.Foo}

Output (click arrow to expand)

checking singletonExpr.scala after phase reifyQuotes
exception while typing def $anonfun(using evidence$1: quoted.QuoteContext): 
  quoted.Expr[(SomeEnum.Foo : SomeEnum)]
 = 
  scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
    scala.collection.immutable.Nil.::[String](
      
        "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
      
    )
  , scala.collection.immutable.Nil).apply(evidence$1) of class class dotty.tools.dotc.ast.Trees$DefDef # 1402
exception while typing {
  def $anonfun(using evidence$1: quoted.QuoteContext): 
    quoted.Expr[(SomeEnum.Foo : SomeEnum)]
   = 
    scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
      scala.collection.immutable.Nil.::[String](
        
          "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
        
      )
    , scala.collection.immutable.Nil).apply(evidence$1)
  closure($anonfun)
} of class class dotty.tools.dotc.ast.Trees$Block # 1403
exception while typing @scala.annotation.internal.ContextResultCount(1) def quoteFoo: 
  ContextFunction1[quoted.QuoteContext, quoted.Expr[SomeEnum.Foo.type]]
 = 
  {
    def $anonfun(using evidence$1: quoted.QuoteContext): 
      quoted.Expr[(SomeEnum.Foo : SomeEnum)]
     = 
      scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
        scala.collection.immutable.Nil.::[String](
          
            "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
          
        )
      , scala.collection.immutable.Nil).apply(evidence$1)
    closure($anonfun)
  } of class class dotty.tools.dotc.ast.Trees$DefDef # 1404
exception while typing @scala.annotation.internal.SourceFile("singletonExpr.scala") final module class 
  singletonExpr$package$
() extends Object() { this: singletonExpr$package.type =>
  private def writeReplace(): AnyRef = 
    new scala.runtime.ModuleSerializationProxy(
      classOf[singletonExpr$package.type]
    )
  @scala.annotation.internal.ContextResultCount(1) def quoteFoo: 
    ContextFunction1[quoted.QuoteContext, quoted.Expr[SomeEnum.Foo.type]]
   = 
    {
      def $anonfun(using evidence$1: quoted.QuoteContext): 
        quoted.Expr[(SomeEnum.Foo : SomeEnum)]
       = 
        scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
          scala.collection.immutable.Nil.::[String](
            
              "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
            
          )
        , scala.collection.immutable.Nil).apply(evidence$1)
      closure($anonfun)
    }
} of class class dotty.tools.dotc.ast.Trees$TypeDef # 1406
exception while typing package <empty> {
  import quoted._
  @scala.annotation.internal.SourceFile("singletonExpr.scala") @
    scala.annotation.internal.Child
  [SomeEnum]() sealed abstract class SomeEnum() extends Object() {}
  final lazy module val SomeEnum: SomeEnum$ = new SomeEnum$()
  @scala.annotation.internal.SourceFile("singletonExpr.scala") final module 
    class
   SomeEnum$() extends Object() { this: SomeEnum.type =>
    private def writeReplace(): AnyRef = 
      new scala.runtime.ModuleSerializationProxy(classOf[SomeEnum.type])
    final val Foo: SomeEnum = 
      {
        final class $anon() extends SomeEnum() {}
        new $anon():SomeEnum
      }
  }
  final lazy module val singletonExpr$package: singletonExpr$package$ = 
    new singletonExpr$package$()
  @scala.annotation.internal.SourceFile("singletonExpr.scala") final module 
    class
   singletonExpr$package$() extends Object() { 
    this: singletonExpr$package.type =>
    private def writeReplace(): AnyRef = 
      new scala.runtime.ModuleSerializationProxy(
        classOf[singletonExpr$package.type]
      )
    @scala.annotation.internal.ContextResultCount(1) def quoteFoo: 
      ContextFunction1[quoted.QuoteContext, quoted.Expr[SomeEnum.Foo.type]]
     = 
      {
        def $anonfun(using evidence$1: quoted.QuoteContext): 
          quoted.Expr[(SomeEnum.Foo : SomeEnum)]
         = 
          scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
            scala.collection.immutable.Nil.::[String](
              
                "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
              
            )
          , scala.collection.immutable.Nil).apply(evidence$1)
        closure($anonfun)
      }
  }
} of class class dotty.tools.dotc.ast.Trees$PackageDef # 1407
*** error while checking singletonExpr.scala after phase reifyQuotes ***
exception occurred while compiling singletonExpr.scala
java.lang.AssertionError: assertion failed: Found:    quoted.Expr[SomeEnum]
Required: quoted.Expr[(SomeEnum.Foo : SomeEnum)]
found: ??
expected: ??
tree = scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
  scala.collection.immutable.Nil.::[String](
    
      "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
    
  )
, scala.collection.immutable.Nil).apply(evidence$1) while compiling singletonExpr.scala
Exception in thread "main" java.lang.AssertionError: assertion failed: Found:    quoted.Expr[SomeEnum]
Required: quoted.Expr[(SomeEnum.Foo : SomeEnum)]
found: ??
expected: ??
tree = scala.internal.quoted.Unpickler.unpickleExpr[SomeEnum](
  scala.collection.immutable.Nil.::[String](
    
      "XKGrH5eAABxRePDJuAAAgVfIIhf9ANgBhEFTVHMBg0ZvbwGIU29tZUVudW0BhzxlbXB0eT4BlXNpbmdsZXRvbkV4cHIkcGFja2FnZReBhAGJUG9zaXRpb25zAZNzaW5nbGV0b25FeHByLnNjYWxhgI+TjXCBc4JQN4NvhXWFM4aGjoYBnwGrhIcAyMmJk/yA"
    
  )
, scala.collection.immutable.Nil).apply(evidence$1)
	at dotty.DottyPredef$.assertFail(DottyPredef.scala:17)
	at dotty.tools.dotc.transform.TreeChecker$Checker.adapt(TreeChecker.scala:560)
	at dotty.tools.dotc.typer.Typer.op$proxy16$1(Typer.scala:2586)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2587)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2590)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2705)
	at dotty.tools.dotc.typer.Typer.$anonfun$34(Typer.scala:1981)
	at dotty.tools.dotc.typer.PrepareInlineable$.dropInlineIfError(PrepareInlineable.scala:217)
	at dotty.tools.dotc.typer.Typer.typedDefDef(Typer.scala:1981)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef$$anonfun$2$$anonfun$1(TreeChecker.scala:477)
	at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef$$anonfun$1(TreeChecker.scala:480)
	at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef(TreeChecker.scala:481)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2433)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2516)
	at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
	at dotty.tools.dotc.typer.Typer.op$proxy16$1(Typer.scala:2586)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2587)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2590)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2612)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2661)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:521)
	at dotty.tools.dotc.typer.Typer.typedBlockStats(Typer.scala:896)
	at dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:900)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$2$$anonfun$1(TreeChecker.scala:503)
	at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock$$anonfun$1(TreeChecker.scala:503)
	at dotty.tools.dotc.transform.TreeChecker$Checker.withBlock(TreeChecker.scala:227)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedBlock(TreeChecker.scala:503)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2464)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2517)
	at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
	at dotty.tools.dotc.typer.Typer.op$proxy16$1(Typer.scala:2586)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2587)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2590)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2705)
	at dotty.tools.dotc.typer.Typer.$anonfun$34(Typer.scala:1981)
	at dotty.tools.dotc.typer.PrepareInlineable$.dropInlineIfError(PrepareInlineable.scala:217)
	at dotty.tools.dotc.typer.Typer.typedDefDef(Typer.scala:1981)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef$$anonfun$2$$anonfun$1(TreeChecker.scala:477)
	at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef$$anonfun$1(TreeChecker.scala:480)
	at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedDefDef(TreeChecker.scala:481)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2433)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2516)
	at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
	at dotty.tools.dotc.typer.Typer.op$proxy16$1(Typer.scala:2586)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2587)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2590)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2612)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2661)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:521)
	at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2118)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedClassDef(TreeChecker.scala:453)
	at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2444)
	at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2448)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2516)
	at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
	at dotty.tools.dotc.typer.Typer.op$proxy16$1(Typer.scala:2586)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2587)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2590)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
	at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2612)
	at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2661)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:521)
	at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2242)
	at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2488)
	at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2517)
	at dotty.tools.dotc.typer.ReTyper.typedUnadapted(ReTyper.scala:122)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typedUnadapted(TreeChecker.scala:333)
	at dotty.tools.dotc.typer.Typer.op$proxy16$1(Typer.scala:2586)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2587)
	at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2590)
	at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
	at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2705)
	at dotty.tools.dotc.transform.TreeChecker.check(TreeChecker.scala:151)
	at dotty.tools.dotc.transform.TreeChecker.run(TreeChecker.scala:120)
	at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:296)
	at scala.collection.immutable.List.map(List.scala:246)
	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:297)
	at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:180)
	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
	at dotty.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:190)
	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:198)
	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:64)
	at dotty.tools.dotc.Run.compileUnits(Run.scala:205)
	at dotty.tools.dotc.Run.compileSources(Run.scala:142)
	at dotty.tools.dotc.Run.compile(Run.scala:124)
	at dotty.tools.dotc.Driver.doCompile(Driver.scala:38)
	at dotty.tools.dotc.Driver.process(Driver.scala:195)
	at dotty.tools.dotc.Driver.process(Driver.scala:164)
	at dotty.tools.dotc.Driver.process(Driver.scala:176)
	at dotty.tools.dotc.Driver.main(Driver.scala:203)
	at dotty.tools.dotc.Main.main(Main.scala)

ReifyQuotes widens singletons here: (related to #4987 ?)
https://github.com/lampepfl/dotty/blob/a05fc4b495a36ee85b9975b5b2757b20e31610f6/compiler/src/dotty/tools/dotc/transform/ReifyQuotes.scala#L171

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions