File tree Expand file tree Collapse file tree 3 files changed +49
-2
lines changed
compiler/src/dotty/tools/dotc/typer Expand file tree Collapse file tree 3 files changed +49
-2
lines changed Original file line number Diff line number Diff line change @@ -292,10 +292,21 @@ trait Deriving {
292292 val companion = companionRef(resultType)
293293 val module = untpd.ref(companion).withSpan(sym.span)
294294 val rhs = untpd.Select (module, nme.derived)
295- if companion.termSymbol.exists then typed(rhs, resultType)
296- else errorTree(rhs, em " $resultType cannot be derived since ${resultType.typeSymbol} has no companion object " )
295+ val derivedMember = companion.member(nme.derived)
296+
297+ if ! companion.termSymbol.exists then
298+ errorTree(rhs, em " $resultType cannot be derived since ${resultType.typeSymbol} has no companion object " )
299+ else if hasExplicitParams(derivedMember.symbol) then
300+ errorTree(rhs, em """ derived instance $resultType failed to generate:
301+ |method `derived` from object ${module} takes explicit term parameters """ )
302+ else
303+ typed(rhs, resultType)
297304 end typeclassInstance
298305
306+ // checks whether any of the params of 'sym' is explicit
307+ def hasExplicitParams (sym : Symbol ) =
308+ ! sym.paramSymss.flatten.forall(sym => sym.isType || sym.is(Flags .Given ) || sym.is(Flags .Implicit ))
309+
299310 def syntheticDef (sym : Symbol ): Tree = inContext(ctx.fresh.setOwner(sym).setNewScope) {
300311 if sym.is(Method ) then tpd.DefDef (sym.asTerm, typeclassInstance(sym))
301312 else tpd.ValDef (sym.asTerm, typeclassInstance(sym)(Nil ))
Original file line number Diff line number Diff line change 1+ -- Error: tests/neg/7722.scala:2:40 ------------------------------------------------------------------------------------
2+ 2 | @scala.annotation.targetName("E") def this() = this(3) // error
3+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4+ | @targetName annotation may not be used on a constructor
Original file line number Diff line number Diff line change 1+ import scala .language .experimental .clauseInterleaving
2+
3+ trait ShowWithExplicit [A ]
4+
5+ object ShowWithExplicit :
6+ def derived [A , B ](explicit : String )(using DummyImplicit )(implicit dummy : DummyImplicit ): ShowWithExplicit [A ] = ???
7+
8+ trait ShowUsingAndImplicit [A ]
9+
10+ object ShowUsingAndImplicit :
11+ def derived [A , B ](using DummyImplicit )(implicit dummy : DummyImplicit ): ShowUsingAndImplicit [A ] = ???
12+
13+ trait ShowUsing [A ]
14+
15+ object ShowUsing :
16+ def derived [A ](using DummyImplicit ): ShowUsing [A ] = ???
17+
18+ trait ShowImplicit [A ]
19+
20+ object ShowImplicit :
21+ def derived [A ](implicit ev : DummyImplicit ): ShowImplicit [A ] = ???
22+
23+ trait ShowContra [- A ]
24+
25+ object ShowContra :
26+ val derived : ShowContra [Any ] = ???
27+
28+ case class Person (name : String ) derives ShowWithExplicit , // error
29+ ShowUsingAndImplicit ,
30+ ShowUsing ,
31+ ShowImplicit ,
32+ ShowContra
You can’t perform that action at this time.
0 commit comments