Open
Description
Compiler versions
3.7.2-RC1-bin-20250510-f784625-NIGHTLY
3.7.0
3.6.4
Minimized code
trait A:
inline def foo: Int
given a: A with
override inline def foo: Int = 1
summon[A]/*(using a)*/.foo // 1
/*transparent*/ inline def summonAAndFoo: Int = summonInline[A].foo
summonAAndFoo //doesn't compile: Deferred inline method foo in trait A cannot be invoked
Output
summon[A]
seems to return an implicit of precise type a.type
.
But summonInline[A]
seems to return just A
upon inlining, that's why Deferred inline method foo in trait A cannot be invoked
.
Is this expected behavior?
The output with scalacOptions ++= Seq( "-Xprint-types", "-Vprint:typer")
:
//[info] <<println:((x: Any): Unit)>(
//[info] <<<<App.a:App.a>:App.a.type>:App.a.type>.foo:=> Int>):Unit>
//[info] inline def summonAAndFoo: Int =
//[info] <
//[info] <<<scala.compiletime.summonInline:([T]: T)>[App.A]:App.A>.foo:
//[info] (=> Int)>
//[info] :Int:Int>
//[info] <<println:((x: Any): Unit)>(<App.summonAAndFoo:=> Int>):Unit>
The output with scalacOptions ++= Seq( "-Xprint-types", "-Vprint:inlining")
:
[info] <<println:((x: Any): Unit)>(<<<1:(1 : Int)> :Int:Int>:Int>):Unit>
[info] inline def summonAAndFoo: Int =
[info] <
[info] <<<scala.compiletime.summonInline:([T]: T)>[App.A]:App.A>.foo:
[info] (=> Int)>
[info] :Int:Int>
[info] <<println:((x: Any): Unit)>(<<<<App.a:App.a>.foo:<error>> :Int:Int>:Int>
[info] ):Unit>
Expectation
summonAAndFoo
should compile and return 1
.
Discovered in https://stackoverflow.com/questions/79614883/how-to-call-an-inline-method-from-within-a-scala-3-6-4-macro