diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index 17873cf62ecb..b202b1e7f500 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -446,7 +446,7 @@ object desugar { val constrTparams = impliedTparams.map(toDefParam(_, keepAnnotations = false)) val constrVparamss = if (originalVparamss.isEmpty) { // ensure parameter list is non-empty - if (isCaseClass && originalTparams.isEmpty) + if (isCaseClass) ctx.error(CaseClassMissingParamList(cdef), namePos) ListOfNil } else if (isCaseClass && originalVparamss.head.exists(_.mods.isOneOf(GivenOrImplicit))) { diff --git a/tests/neg/EmptyCaseClassParams.check b/tests/neg/EmptyCaseClassParams.check new file mode 100644 index 000000000000..6cd019571c73 --- /dev/null +++ b/tests/neg/EmptyCaseClassParams.check @@ -0,0 +1,18 @@ +-- [E004] Syntax Error: tests/neg/EmptyCaseClassParams.scala:2:13 ------------------------------------------------------ +2 | case class A[T] // error + | ^ + | A case class must have at least one parameter list + +longer explanation available when compiling with `-explain` +-- [E004] Syntax Error: tests/neg/EmptyCaseClassParams.scala:5:13 ------------------------------------------------------ +5 | case class B[T] // error + | ^ + | A case class must have at least one parameter list + +longer explanation available when compiling with `-explain` +-- [E004] Syntax Error: tests/neg/EmptyCaseClassParams.scala:9:9 ------------------------------------------------------- +9 | case D[T] extends Foo[T] // error + | ^ + | A case class must have at least one parameter list + +longer explanation available when compiling with `-explain` diff --git a/tests/neg/EmptyCaseClassParams.scala b/tests/neg/EmptyCaseClassParams.scala new file mode 100644 index 000000000000..e41ce2d922cb --- /dev/null +++ b/tests/neg/EmptyCaseClassParams.scala @@ -0,0 +1,11 @@ +object EmptyCaseClassParams{ + case class A[T] // error + + class C + case class B[T] // error + extends C + + enum Foo[T]{ + case D[T] extends Foo[T] // error + } +} diff --git a/tests/neg/derive-eq.scala b/tests/neg/derive-eq.scala index 748741c59f8f..bd4b5533ad50 100644 --- a/tests/neg/derive-eq.scala +++ b/tests/neg/derive-eq.scala @@ -9,7 +9,7 @@ enum Lst[T] derives Eql { case Nil() } -case class Triple[S, T, U] derives Eql +case class Triple[S, T, U]() derives Eql object Test extends App { diff --git a/tests/neg/enumsAccess.scala b/tests/neg/enumsAccess.scala index c35beba60e11..a654f0633ead 100644 --- a/tests/neg/enumsAccess.scala +++ b/tests/neg/enumsAccess.scala @@ -5,7 +5,7 @@ object test1 { enum E4 { case C1(x: INT) // error: illegal reference case C2(x: Int = defaultX) // error: illegal reference - case C3[T <: INT] // error: illegal reference + case C3[T <: INT]() // error: illegal reference } object E4 { @@ -24,7 +24,7 @@ object test2 { enum E5 { case C1(x: INT) // ok case C2(x: Int = defaultX) // ok - case C3[T <: INT] // ok + case C3[T <: INT]() // ok } } @@ -39,7 +39,7 @@ object test3 { enum E5 { case C1(x: INT) // ok case C2(x: Int = defaultX)// ok - case C3[T <: INT] // ok + case C3[T <: INT]() // ok } } @@ -48,7 +48,7 @@ object test4 { enum E5 { case C1(x: INT) // error: illegal reference case C2(x: Int = defaultX) // error: illegal reference - case C3[T <: INT] // error: illegal reference + case C3[T <: INT]() // error: illegal reference } import E5._ @@ -76,7 +76,7 @@ object test6 { import E5._ enum E5[T](x: T) { case C3() extends E5[INT](defaultX) // ok - case C4 extends E5[INT](defaultX) // ok + case C4() extends E5[INT](defaultX) // ok } object E5 { @@ -90,7 +90,7 @@ object test7 { trait Arg enum E(x: Arg) { - case C extends E(this) // error: illegal reference to `this` + case C() extends E(this) // error: illegal reference to `this` } object E extends Arg } diff --git a/tests/neg/parser-stability-19.scala b/tests/neg/parser-stability-19.scala index 07938c846f4a..42f2005d6060 100644 --- a/tests/neg/parser-stability-19.scala +++ b/tests/neg/parser-stability-19.scala @@ -1,5 +1,5 @@ object x0 { - case class x0[] // error // error + case class x0[]() // error // error def x0( ) ] // error // error def x0 ( x0:x0 ):x0.type = x1 x0 // error // error // error \ No newline at end of file diff --git a/tests/neg/typeclass-derivation2.scala b/tests/neg/typeclass-derivation2.scala index 440a4608d434..6a4ca681e30a 100644 --- a/tests/neg/typeclass-derivation2.scala +++ b/tests/neg/typeclass-derivation2.scala @@ -101,10 +101,10 @@ object TypeLevel { enum Shape { /** A sum with alternative types `Alts` */ - case Cases[Alts <: Tuple] + case Cases[Alts <: Tuple]() /** A product type `T` with element types `Elems` */ - case Case[T, Elems <: Tuple] + case Case[T, Elems <: Tuple]() } /** Every generic derivation starts with a typeclass instance of this type. diff --git a/tests/pos/gadt-GadtStlc.scala b/tests/pos/gadt-GadtStlc.scala index e51c5f61bf90..26910347ffed 100644 --- a/tests/pos/gadt-GadtStlc.scala +++ b/tests/pos/gadt-GadtStlc.scala @@ -10,7 +10,7 @@ object GadtStlc { // Var[M[W]] sealed trait Var[A] object VarW extends Var[W] - case class VarM[A] extends Var[M[A]] + case class VarM[A]() extends Var[M[A]] // \s.e sealed trait Abs[S, E] diff --git a/tests/pos/i4176-gadt.scala b/tests/pos/i4176-gadt.scala index 5c7efa6993c9..4d17b4e39c64 100644 --- a/tests/pos/i4176-gadt.scala +++ b/tests/pos/i4176-gadt.scala @@ -1,7 +1,7 @@ object i4176 { sealed trait TNat case class TZero() extends TNat - case class TSucc[N <: TNat] extends TNat + case class TSucc[N <: TNat]() extends TNat object TNatSum { sealed trait TSum[M, N, R] diff --git a/tests/pos/i4316.scala b/tests/pos/i4316.scala index 2b1e9a854e29..e59d44e4863a 100644 --- a/tests/pos/i4316.scala +++ b/tests/pos/i4316.scala @@ -1,6 +1,6 @@ object Test { - case class Bar[A] + case class Bar[A]() def meth[A](consumer: A => Unit, s: Bar[A]): Unit = { s match { diff --git a/tests/run/derive-multi.scala b/tests/run/derive-multi.scala index a8a9a70dc416..e34baf1621c0 100644 --- a/tests/run/derive-multi.scala +++ b/tests/run/derive-multi.scala @@ -26,7 +26,7 @@ enum Lst[T] derives A, B { case Nil() } -case class Triple[S, T, U] derives A, B +case class Triple[S, T, U]() derives A, B object Test1 { import Lst._ diff --git a/tests/run/typeclass-derivation2.scala b/tests/run/typeclass-derivation2.scala index c6d73443cb33..8b5b297c0791 100644 --- a/tests/run/typeclass-derivation2.scala +++ b/tests/run/typeclass-derivation2.scala @@ -103,10 +103,10 @@ object TypeLevel { enum Shape { /** A sum with alternative types `Alts` */ - case Cases[Alts <: Tuple] + case Cases[Alts <: Tuple]() /** A product type `T` with element types `Elems` */ - case Case[T, Elems <: Tuple] + case Case[T, Elems <: Tuple]() } /** Every generic derivation starts with a typeclass instance of this type. diff --git a/tests/run/typeclass-derivation2a.scala b/tests/run/typeclass-derivation2a.scala index fc5e5bcfff17..137049f5c50b 100644 --- a/tests/run/typeclass-derivation2a.scala +++ b/tests/run/typeclass-derivation2a.scala @@ -88,10 +88,10 @@ object TypeLevel { enum Shape { /** A sum with alternative types `Alts` */ - case Cases[Alts <: Tuple] + case Cases[Alts <: Tuple]() /** A product type `T` with element types `Elems` */ - case Case[T, Elems <: Tuple] + case Case[T, Elems <: Tuple]() } /** Every generic derivation starts with a typeclass instance of this type.