Skip to content

Commit c84862c

Browse files
committed
Add empty case class params check. Add test. Fix existing tests.
1 parent 36707c7 commit c84862c

13 files changed

+53
-19
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2396,7 +2396,15 @@ object Parsers {
23962396
}
23972397
else Nil
23982398
}
2399-
recur(firstClause = true, 0, ofInstance)
2399+
2400+
val start = in.lastOffset
2401+
val params = recur(firstClause = true, 0, ofInstance)
2402+
2403+
if (ofCaseClass && params.isEmpty)
2404+
syntaxError( "case classes without a parameter list are not allowed;\n"+
2405+
"use either case objects or case classes with an explicit `()' as a parameter list.", start)
2406+
2407+
params
24002408
}
24012409

24022410
/* -------- DEFS ------------------------------------------- */

tests/neg/EmptyCaseClassParams.check

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-- Error: tests/neg/EmptyCaseClassParams.scala:2:17 --------------------------------------------------------------------
2+
2 | case class A[T] // error
3+
| ^
4+
| case classes without a parameter list are not allowed;
5+
| use either case objects or case classes with an explicit `()' as a parameter list.
6+
-- Error: tests/neg/EmptyCaseClassParams.scala:5:17 --------------------------------------------------------------------
7+
5 | case class B[T] // error
8+
| ^
9+
| case classes without a parameter list are not allowed;
10+
| use either case objects or case classes with an explicit `()' as a parameter list.
11+
-- Error: tests/neg/EmptyCaseClassParams.scala:9:13 --------------------------------------------------------------------
12+
9 | case D[T] extends Foo[T] // error
13+
| ^
14+
| case classes without a parameter list are not allowed;
15+
| use either case objects or case classes with an explicit `()' as a parameter list.

tests/neg/EmptyCaseClassParams.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
object EmptyCaseClassParams{
2+
case class A[T] // error
3+
4+
class C
5+
case class B[T] // error
6+
extends C
7+
8+
enum Foo[T]{
9+
case D[T] extends Foo[T] // error
10+
}
11+
}

tests/neg/derive-eq.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ enum Lst[T] derives Eql {
99
case Nil()
1010
}
1111

12-
case class Triple[S, T, U] derives Eql
12+
case class Triple[S, T, U]() derives Eql
1313

1414

1515
object Test extends App {

tests/neg/enumsAccess.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ object test1 {
55
enum E4 {
66
case C1(x: INT) // error: illegal reference
77
case C2(x: Int = defaultX) // error: illegal reference
8-
case C3[T <: INT] // error: illegal reference
8+
case C3[T <: INT]() // error: illegal reference
99
}
1010

1111
object E4 {
@@ -24,7 +24,7 @@ object test2 {
2424
enum E5 {
2525
case C1(x: INT) // ok
2626
case C2(x: Int = defaultX) // ok
27-
case C3[T <: INT] // ok
27+
case C3[T <: INT]() // ok
2828
}
2929
}
3030

@@ -39,7 +39,7 @@ object test3 {
3939
enum E5 {
4040
case C1(x: INT) // ok
4141
case C2(x: Int = defaultX)// ok
42-
case C3[T <: INT] // ok
42+
case C3[T <: INT]() // ok
4343
}
4444
}
4545

@@ -48,7 +48,7 @@ object test4 {
4848
enum E5 {
4949
case C1(x: INT) // error: illegal reference
5050
case C2(x: Int = defaultX) // error: illegal reference
51-
case C3[T <: INT] // error: illegal reference
51+
case C3[T <: INT]() // error: illegal reference
5252
}
5353

5454
import E5._
@@ -76,7 +76,7 @@ object test6 {
7676
import E5._
7777
enum E5[T](x: T) {
7878
case C3() extends E5[INT](defaultX) // ok
79-
case C4 extends E5[INT](defaultX) // ok
79+
case C4() extends E5[INT](defaultX) // ok
8080
}
8181

8282
object E5 {
@@ -90,7 +90,7 @@ object test7 {
9090
trait Arg
9191

9292
enum E(x: Arg) {
93-
case C extends E(this) // error: illegal reference to `this`
93+
case C() extends E(this) // error: illegal reference to `this`
9494
}
9595
object E extends Arg
9696
}

tests/neg/parser-stability-19.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
object x0 {
2-
case class x0[] // error // error
2+
case class x0[]() // error // error
33
def x0( ) ] // error // error
44
def x0 ( x0:x0 ):x0.type = x1 x0 // error // error
55
// error

tests/neg/typeclass-derivation2.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ object TypeLevel {
101101
enum Shape {
102102

103103
/** A sum with alternative types `Alts` */
104-
case Cases[Alts <: Tuple]
104+
case Cases[Alts <: Tuple]()
105105

106106
/** A product type `T` with element types `Elems` */
107-
case Case[T, Elems <: Tuple]
107+
case Case[T, Elems <: Tuple]()
108108
}
109109

110110
/** Every generic derivation starts with a typeclass instance of this type.

tests/pos/gadt-GadtStlc.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ object GadtStlc {
1010
// Var[M[W]]
1111
sealed trait Var[A]
1212
object VarW extends Var[W]
13-
case class VarM[A] extends Var[M[A]]
13+
case class VarM[A]() extends Var[M[A]]
1414

1515
// \s.e
1616
sealed trait Abs[S, E]

tests/pos/i4176-gadt.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
object i4176 {
22
sealed trait TNat
33
case class TZero() extends TNat
4-
case class TSucc[N <: TNat] extends TNat
4+
case class TSucc[N <: TNat]() extends TNat
55

66
object TNatSum {
77
sealed trait TSum[M, N, R]

tests/pos/i4316.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
object Test {
22

3-
case class Bar[A]
3+
case class Bar[A]()
44

55
def meth[A](consumer: A => Unit, s: Bar[A]): Unit = {
66
s match {

tests/run/derive-multi.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ enum Lst[T] derives A, B {
2626
case Nil()
2727
}
2828

29-
case class Triple[S, T, U] derives A, B
29+
case class Triple[S, T, U]() derives A, B
3030

3131
object Test1 {
3232
import Lst._

tests/run/typeclass-derivation2.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@ object TypeLevel {
103103
enum Shape {
104104

105105
/** A sum with alternative types `Alts` */
106-
case Cases[Alts <: Tuple]
106+
case Cases[Alts <: Tuple]()
107107

108108
/** A product type `T` with element types `Elems` */
109-
case Case[T, Elems <: Tuple]
109+
case Case[T, Elems <: Tuple]()
110110
}
111111

112112
/** Every generic derivation starts with a typeclass instance of this type.

tests/run/typeclass-derivation2a.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ object TypeLevel {
8888
enum Shape {
8989

9090
/** A sum with alternative types `Alts` */
91-
case Cases[Alts <: Tuple]
91+
case Cases[Alts <: Tuple]()
9292

9393
/** A product type `T` with element types `Elems` */
94-
case Case[T, Elems <: Tuple]
94+
case Case[T, Elems <: Tuple]()
9595
}
9696

9797
/** Every generic derivation starts with a typeclass instance of this type.

0 commit comments

Comments
 (0)