Skip to content

Bad parameter reference for inlined given definition #9965

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

Closed
nicolasstucki opened this issue Oct 7, 2020 · 1 comment · Fixed by #10915
Closed

Bad parameter reference for inlined given definition #9965

nicolasstucki opened this issue Oct 7, 2020 · 1 comment · Fixed by #10915

Comments

@nicolasstucki
Copy link
Contributor

Minimized code

class D[T]

class C {
  def f() = {
    locally {
      given d[T] as D[T]
      g[D[Int]](d[Int])
    }
  }

  inline def locally[T](inline body: T): T = body

  def g[T](x: T): T = x
}

Output (click arrow to expand)

checking tests/pos/inlined-given.scala after phase typer
exception while typing this.g[D[Int]](d[Int]) of class class dotty.tools.dotc.ast.Trees$Apply # -1
exception while typing {
  class d[T >: Nothing <: Any]() extends D[d.this.T]() {
    T
  }
  final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
  this.g[D[Int]](d[Int])
} of class class dotty.tools.dotc.ast.Trees$Block # -1
exception while typing {
  class d[T >: Nothing <: Any]() extends D[d.this.T]() {
    T
  }
  final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
  this.g[D[Int]](d[Int])
} of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing {
  class d[T >: Nothing <: Any]() extends D[d.this.T]() {
    T
  }
  final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
  this.g[D[Int]](d[Int])
}:D[Int] of class class dotty.tools.dotc.ast.Trees$Typed # -1
exception while typing {
  class d[T >: Nothing <: Any]() extends D[d.this.T]() {
    T
  }
  final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
  this.g[D[Int]](d[Int])
}:D[Int] of class class dotty.tools.dotc.ast.Trees$Inlined # -1
exception while typing {
  {
    class d[T >: Nothing <: Any]() extends D[d.this.T]() {
      T
    }
    final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
    this.g[D[Int]](d[Int])
  }:D[Int]
} of class class dotty.tools.dotc.ast.Trees$Block # -1
exception while typing def f(): D[Int] = 
  {
    {
      class d[T >: Nothing <: Any]() extends D[d.this.T]() {
        T
      }
      final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
      this.g[D[Int]](d[Int])
    }:D[Int]
  } of class class dotty.tools.dotc.ast.Trees$DefDef # -1
exception while typing class C() extends Object() {
  def f(): D[Int] = 
    {
      {
        class d[T >: Nothing <: Any]() extends D[d.this.T]() {
          T
        }
        final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
        this.g[D[Int]](d[Int])
      }:D[Int]
    }
  inline def locally[T >: Nothing <: Any](inline body: T): T = body:T
  def g[T >: Nothing <: Any](x: T): T = x
} of class class dotty.tools.dotc.ast.Trees$TypeDef # -1
exception while typing package <empty> {
  class D[T >: Nothing <: Any]() extends Object() {
    T
  }
  class C() extends Object() {
    def f(): D[Int] = 
      {
        {
          class d[T >: Nothing <: Any]() extends D[d.this.T]() {
            T
          }
          final given def d[T >: Nothing <: Any]: d[T] = new d[T]()
          this.g[D[Int]](d[Int])
        }:D[Int]
      }
    inline def locally[T >: Nothing <: Any](inline body: T): T = body:T
    def g[T >: Nothing <: Any](x: T): T = x
  }
} of class class dotty.tools.dotc.ast.Trees$PackageDef # -1
*** error while checking tests/pos/inlined-given.scala after phase typer ***
exception occurred while compiling tests/pos/inlined-given.scala
class dotty.tools.dotc.reporting.Diagnostic$StickyError at tests/pos/inlined-given.scala:<90..90>: bad parameter reference d.this.T at Ycheck
the parameter is type T in class d but the prefix (d.this : d)
does not define any corresponding arguments. while compiling tests/pos/inlined-given.scala
Exception in thread "main" class dotty.tools.dotc.reporting.Diagnostic$StickyError at tests/pos/inlined-given.scala:<90..90>: bad parameter reference d.this.T at Ycheck
the parameter is type T in class d but the prefix (d.this : d)
does not define any corresponding arguments.
        at dotty.tools.dotc.report$.error(report.scala:71)
        at dotty.tools.dotc.report$.error(report.scala:75)
        at dotty.tools.dotc.typer.ErrorReporting$.errorType(ErrorReporting.scala:34)
        at dotty.tools.dotc.typer.ErrorReporting$.errorTree(ErrorReporting.scala:26)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2523)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2708)
        at dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:903)
        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:2467)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2520)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.typedInlined(Typer.scala:1630)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedInlined$$anonfun$1(TreeChecker.scala:506)
        at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedInlined(TreeChecker.scala:506)
        at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2480)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2520)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.ReTyper.typedTyped(ReTyper.scala:60)
        at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2464)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2520)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.typedInlined(Typer.scala:1630)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedInlined$$anonfun$1(TreeChecker.scala:506)
        at dotty.tools.dotc.transform.TreeChecker$Checker.withDefinedSyms(TreeChecker.scala:199)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedInlined(TreeChecker.scala:506)
        at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2480)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2520)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2708)
        at dotty.tools.dotc.typer.Typer.typedBlock(Typer.scala:903)
        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:2467)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2520)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2708)
        at dotty.tools.dotc.typer.Typer.$anonfun$34(Typer.scala:1982)
        at dotty.tools.dotc.typer.PrepareInlineable$.dropInlineIfError(PrepareInlineable.scala:217)
        at dotty.tools.dotc.typer.Typer.typedDefDef(Typer.scala:1982)
        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:2436)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2519)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2615)
        at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2664)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:521)
        at dotty.tools.dotc.typer.Typer.typedClassDef(Typer.scala:2120)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedClassDef(TreeChecker.scala:453)
        at dotty.tools.dotc.typer.Typer.typedTypeOrClassDef$2(Typer.scala:2447)
        at dotty.tools.dotc.typer.Typer.typedNamed$1(Typer.scala:2451)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2519)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.traverse$1(Typer.scala:2615)
        at dotty.tools.dotc.typer.Typer.typedStats(Typer.scala:2664)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typedStats(TreeChecker.scala:521)
        at dotty.tools.dotc.typer.Typer.typedPackageDef(Typer.scala:2245)
        at dotty.tools.dotc.typer.Typer.typedUnnamed$1(Typer.scala:2491)
        at dotty.tools.dotc.typer.Typer.typedUnadapted(Typer.scala:2520)
        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.typed(Typer.scala:2589)
        at dotty.tools.dotc.typer.Typer.typed(Typer.scala:2593)
        at dotty.tools.dotc.transform.TreeChecker$Checker.typed(TreeChecker.scala:317)
        at dotty.tools.dotc.typer.Typer.typedExpr(Typer.scala:2708)
        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:185)
        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:195)
        at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:203)
        at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
        at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:67)
        at dotty.tools.dotc.Run.compileUnits(Run.scala:210)
        at dotty.tools.dotc.Run.compileSources(Run.scala:147)
        at dotty.tools.dotc.Run.compile(Run.scala:129)
        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)
@odersky
Copy link
Contributor

odersky commented Oct 14, 2020

#9965 is unfortunately really hard to fix. Essentially, we have to copy a symbol graph which in the case of emebedded classes can become quite complicated. We manage with monomorphic classes, but cannot handle type parameters or children annotations (there's another issue for that). Essentially, whereever we have hidden Symbol->Symbol references, we fail.

odersky added a commit to dotty-staging/dotty that referenced this issue Dec 26, 2020
nicolasstucki added a commit that referenced this issue Jan 4, 2021
Fix #9965: Properly handle class type parameters when copying symbols
@Kordyjan Kordyjan added this to the 3.0.0 milestone Aug 2, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants