File tree 3 files changed +48
-2
lines changed
compiler/src/dotty/tools/dotc/typer
3 files changed +48
-2
lines changed Original file line number Diff line number Diff line change @@ -292,10 +292,21 @@ trait Deriving {
292
292
val companion = companionRef(resultType)
293
293
val module = untpd.ref(companion).withSpan(sym.span)
294
294
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)
297
304
end typeclassInstance
298
305
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
+
299
310
def syntheticDef (sym : Symbol ): Tree = inContext(ctx.fresh.setOwner(sym).setNewScope) {
300
311
if sym.is(Method ) then tpd.DefDef (sym.asTerm, typeclassInstance(sym))
301
312
else tpd.ValDef (sym.asTerm, typeclassInstance(sym)(Nil ))
Original file line number Diff line number Diff line change
1
+ -- Error: tests/neg/i15987.scala:26:40 ---------------------------------------------------------------------------------
2
+ 26 |case class Person(name: String) derives ShowWithExplicit, // error
3
+ | ^
4
+ | derived instance ShowWithExplicit[Person] failed to generate:
5
+ | method `derived` from object ShowWithExplicit takes explicit term parameters
Original file line number Diff line number Diff line change
1
+ trait ShowWithExplicit [A ]
2
+
3
+ object ShowWithExplicit :
4
+ def derived [A , B ](explicit : String )(using DummyImplicit )(implicit dummy : DummyImplicit ): ShowWithExplicit [A ] = ???
5
+
6
+ trait ShowUsingAndImplicit [A ]
7
+
8
+ object ShowUsingAndImplicit :
9
+ def derived [A , B ](using DummyImplicit )(implicit dummy : DummyImplicit ): ShowUsingAndImplicit [A ] = ???
10
+
11
+ trait ShowUsing [A ]
12
+
13
+ object ShowUsing :
14
+ def derived [A ](using DummyImplicit ): ShowUsing [A ] = ???
15
+
16
+ trait ShowImplicit [A ]
17
+
18
+ object ShowImplicit :
19
+ def derived [A ](implicit ev : DummyImplicit ): ShowImplicit [A ] = ???
20
+
21
+ trait ShowContra [- A ]
22
+
23
+ object ShowContra :
24
+ val derived : ShowContra [Any ] = ???
25
+
26
+ case class Person (name : String ) derives ShowWithExplicit , // error
27
+ ShowUsingAndImplicit ,
28
+ ShowUsing ,
29
+ ShowImplicit ,
30
+ ShowContra
You can’t perform that action at this time.
0 commit comments