diff --git a/compiler/src/dotty/tools/dotc/typer/Deriving.scala b/compiler/src/dotty/tools/dotc/typer/Deriving.scala index a8de83664001..39a775d61f8c 100644 --- a/compiler/src/dotty/tools/dotc/typer/Deriving.scala +++ b/compiler/src/dotty/tools/dotc/typer/Deriving.scala @@ -83,7 +83,10 @@ trait Deriving { */ private def processDerivedInstance(derived: untpd.Tree): Unit = { val originalTypeClassType = typedAheadType(derived, AnyTypeConstructorProto).tpe - val typeClassType = checkClassType(underlyingClassRef(originalTypeClassType), derived.srcPos, traitReq = false, stablePrefixReq = true) + val underlyingClassType = underlyingClassRef(originalTypeClassType) + val typeClassType = checkClassType( + underlyingClassType.orElse(originalTypeClassType), + derived.srcPos, traitReq = false, stablePrefixReq = true) val typeClass = typeClassType.classSymbol val typeClassParams = typeClass.typeParams val typeClassArity = typeClassParams.length diff --git a/tests/neg/i13808.check b/tests/neg/i13808.check new file mode 100644 index 000000000000..e9b55a5ddec2 --- /dev/null +++ b/tests/neg/i13808.check @@ -0,0 +1,8 @@ +-- Error: tests/neg/i13808.scala:13:37 --------------------------------------------------------------------------------- +13 |case class Boom[A](value: A) derives OpaqueType, Foo // error // error + | ^^^^^^^^^^ + | OpaqueTypes.OpaqueType is not a class type +-- Error: tests/neg/i13808.scala:13:49 --------------------------------------------------------------------------------- +13 |case class Boom[A](value: A) derives OpaqueType, Foo // error // error + | ^^^ + | FooModule.Foo is not a class type diff --git a/tests/neg/i13808.scala b/tests/neg/i13808.scala new file mode 100644 index 000000000000..6dd568c69423 --- /dev/null +++ b/tests/neg/i13808.scala @@ -0,0 +1,14 @@ +object OpaqueTypes: + opaque type OpaqueType[A] = List[A] + object OpaqueType: + def derived[A]: OpaqueType[A] = Nil + +object FooModule: + type Foo[A] + object Foo: + def derived[A]: Foo[A] = Nil.asInstanceOf[Foo[A]] + +import FooModule.Foo +import OpaqueTypes.OpaqueType +case class Boom[A](value: A) derives OpaqueType, Foo // error // error +