Skip to content

StackOverflowError in TypeReprStructure printer for structural type with type member #22649

Closed
@TomasMikula

Description

@TomasMikula

Compiler version

3.6.3

Minimized code

defs.scala

import scala.quoted.*

type Structural = {
  type T
  def make: T
}

transparent inline def go =
  ${ goImpl }

private def goImpl(using Quotes): Expr[Any] = {
  import quotes.reflect.{*, given}

  val t = '{
    new AnyRef {
      opaque type T = Int
      def make: T = 0
    } : Structural
  }

  val tpe = t.asTerm.tpe

  println(Printer.TypeReprCode.show(tpe))   // OK

  try {
    Printer.TypeReprStructure.show(tpe) // StackOverflowError
  } catch {
    case e: StackOverflowError =>
      e.printStackTrace
  }

  Expr("hello")
}

test.scala

val x = go

Output

% ~/Downloads/scala3-3.6.3-aarch64-apple-darwin/bin/scalac defs.scala test.scala
java.lang.Object {
  type T >: scala.Nothing <: scala.Any
  def make: this.<none>
}
java.lang.StackOverflowError
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:201)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:207)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:209)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:209)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:231)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:229)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:207)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:221)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:209)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:231)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:229)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:207)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:221)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter$TypeOps.$plus$eq(Extractors.scala:303)
	at scala.quoted.runtime.impl.printers.Extractors$ExtractorsPrinter.visitType(Extractors.scala:209)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions