File tree Expand file tree Collapse file tree 9 files changed +94
-3
lines changed
compiler/src/dotty/tools/dotc/typer Expand file tree Collapse file tree 9 files changed +94
-3
lines changed Original file line number Diff line number Diff line change @@ -3277,7 +3277,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
32773277 val superCls = cls.superClass
32783278 superCls.exists && superCls.asClass.baseClasses.contains(m.symbol.owner)
32793279
3280- def givenImpl (mbr : TermRef ): ValDef =
3280+ def givenImpl (mbr : TermRef ): ValDef | EmptyTree . type =
32813281 val dcl = mbr.symbol
32823282 val target = dcl.info.asSeenFrom(cls.thisType, dcl.owner)
32833283 val constr = cls.primaryConstructor
@@ -3315,7 +3315,16 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
33153315 cpy.Select (id)(This (cls), id.name)
33163316 case _ =>
33173317 super .transform(tree)
3318- ValDef (impl, anchorParams.transform(rhs)).withSpan(impl.span.endPos)
3318+
3319+ rhs.tpe match
3320+ case tp : NamedType if tp.prefix.typeSymbol == cls && tp.name == mbr.name && ! tp.typeSymbol.is(Method ) =>
3321+ report.error(
3322+ em """ Inferred implementation of the deferred ${dcl.showLocated} is self-recursive.
3323+ |An implementing given needs to be written explicitly. """ ,
3324+ cdef.srcPos)
3325+ EmptyTree
3326+ case _ =>
3327+ ValDef (impl, anchorParams.transform(rhs)).withSpan(impl.span.endPos)
33193328 end givenImpl
33203329
33213330 val givenImpls =
Original file line number Diff line number Diff line change 99-- Error: tests/neg/deferred-givens.scala:26:8 -------------------------------------------------------------------------
101026 | class E extends A2 // error, can't summon polymorphic given
1111 | ^^^^^^^^^^^^^^^^^^
12- | Cannnot infer the implementation of the deferred given instance given_Ctx3_T in trait A2
12+ | Cannot infer the implementation of the deferred given instance given_Ctx3_T in trait A2
1313 | since that given is parameterized. An implementing given needs to be written explicitly.
Original file line number Diff line number Diff line change 1+ -- Error: tests/neg/i22589.scala:15:7 ----------------------------------------------------------------------------------
2+ 15 |object Person extends CompanionEssentials[Person]: // error
3+ |^
4+ |Inferred implementation of the deferred given instance given_MyCodec_E in trait CompanionEssentials is self-recursive.
5+ |An implementing given needs to be written explicitly.
6+ 16 | //override final lazy given given_MyCodec_E: MyCodec[Person] = Person.given_MyCodec_E
7+ 17 | override def toString = ""
Original file line number Diff line number Diff line change 1+
2+ //> using options -Wsafe-init -Ysafe-init-global
3+
4+ import scala .compiletime .deferred
5+
6+ trait MyCodec [E ]
7+
8+ object auto :
9+ trait CompanionEssentials [E ]:
10+ given MyCodec [E ] = deferred
11+
12+ import auto .CompanionEssentials
13+
14+ case class Person (name : String , age : Int )
15+ object Person extends CompanionEssentials [Person ]: // error
16+ // override final lazy given given_MyCodec_E: MyCodec[Person] = Person.given_MyCodec_E
17+ override def toString = " "
Original file line number Diff line number Diff line change 1+ -- Error: tests/neg/i22589b.scala:13:7 ---------------------------------------------------------------------------------
2+ 13 |object Person extends CompanionEssentials[Person]: // error
3+ |^
4+ |Inferred implementation of the deferred given instance myc in trait CompanionEssentials is self-recursive.
5+ |An implementing given needs to be written explicitly.
6+ 14 | given String = "hw"
7+ 15 | given myc(using String): MyCodec[Person] = new MyCodec[Person] {}
8+ 16 | override def toString = ""
Original file line number Diff line number Diff line change 1+
2+ import scala .compiletime .deferred
3+
4+ trait MyCodec [E ]
5+
6+ object auto :
7+ trait CompanionEssentials [E ]:
8+ given myc : MyCodec [E ] = deferred
9+
10+ import auto .CompanionEssentials
11+
12+ case class Person (name : String , age : Int )
13+ object Person extends CompanionEssentials [Person ]: // error
14+ given String = " hw"
15+ given myc (using String ): MyCodec [Person ] = new MyCodec [Person ] {}
16+ override def toString = " "
Original file line number Diff line number Diff line change 1+ -- Error: tests/neg/i22589c.scala:8:7 ----------------------------------------------------------------------------------
2+ 8 |object A extends Base[A.P] { // error
3+ |^
4+ |Inferred implementation of the deferred given instance given_TC_T in trait Base is self-recursive.
5+ |An implementing given needs to be written explicitly.
6+ 9 | case class P()
7+ 10 |}
Original file line number Diff line number Diff line change 1+
2+ trait TC [T ]
3+
4+ trait Base [T ] {
5+ given TC [T ] = scala.compiletime.deferred
6+ }
7+
8+ object A extends Base [A .P ] { // error
9+ case class P ()
10+ }
Original file line number Diff line number Diff line change 1+
2+ import scala .compiletime .deferred
3+
4+ trait MyCodec [E ]
5+
6+ object auto :
7+ trait CompanionEssentials [E ]:
8+ // given [E] => MyCodec[E] = deferred
9+ given MyCodec [E ] = deferred
10+
11+ import auto .CompanionEssentials
12+
13+ case class Person (name : String , age : Int )
14+ object Person extends CompanionEssentials [Person ]:
15+ // given something: [E] => MyCodec[E] = new MyCodec[E] {}
16+ given something : MyCodec [Person ] = new MyCodec [Person ] {}
17+ override def toString = " "
You can’t perform that action at this time.
0 commit comments