Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
TomasMikula opened this issue Feb 24, 2025 · 0 comments
Assignees
Labels
area:library Standard library area:metaprogramming:reflection Issues related to the quotes reflection API itype:bug Spree Suitable for a future Spree

Comments

@TomasMikula
Copy link
Contributor

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)
@TomasMikula TomasMikula added itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels Feb 24, 2025
@hamzaremmal hamzaremmal self-assigned this Feb 24, 2025
@hamzaremmal hamzaremmal added area:library Standard library Spree Suitable for a future Spree area:metaprogramming:reflection Issues related to the quotes reflection API and removed stat:needs triage Every issue needs to have an "area" and "itype" label labels Feb 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:library Standard library area:metaprogramming:reflection Issues related to the quotes reflection API itype:bug Spree Suitable for a future Spree
Projects
None yet
Development

No branches or pull requests

2 participants