File tree Expand file tree Collapse file tree 9 files changed +54
-72
lines changed
compiler/src/dotty/tools/dotc/transform Expand file tree Collapse file tree 9 files changed +54
-72
lines changed Original file line number Diff line number Diff line change @@ -553,7 +553,14 @@ class PostTyper extends MacroTransform with InfoTransformer { thisPhase =>
553553 report.error(" classes that extend MacroAnnotation must not be inner/local classes" , sym.srcPos)
554554
555555 private def checkErasedDef (tree : ValOrDefDef )(using Context ): Unit =
556+ def checkOnlyErasedParams (): Unit = tree match
557+ case tree : DefDef =>
558+ for params <- tree.paramss; param <- params if ! param.symbol.isType && ! param.symbol.is(Erased ) do
559+ report.error(" erased definition can only have erased parameters" , param.srcPos)
560+ case _ =>
561+
556562 if tree.symbol.is(Erased , butNot = Macro ) then
563+ checkOnlyErasedParams()
557564 val tpe = tree.rhs.tpe
558565 if tpe.derivesFrom(defn.NothingClass ) then
559566 report.error(" `erased` definition cannot be implemented with en expression of type Nothing" , tree.srcPos)
Original file line number Diff line number Diff line change @@ -2,7 +2,7 @@ import scala.language.experimental.erasedDefinitions
22
33erased def parameterless : String = " y"
44
5- erased def e (x : String ): String = " x"
5+ erased def e (erased x : String ): String = " x"
66def foo (erased a : String )(b : String ): String =
77 println(s " foo(a)( $b) " )
88 b
Original file line number Diff line number Diff line change @@ -25,8 +25,8 @@ test$package
2525Object
2626<empty>.test$package
2727foo
28- 181
29- 203
28+ 188
29+ 210
30307
3131println
3232Apply
@@ -42,8 +42,8 @@ test$package
4242Object
4343<empty>.test$package
4444foo
45- 189
46- 202
45+ 196
46+ 209
47477
4848s
4949Apply
@@ -59,8 +59,8 @@ test$package
5959Object
6060<empty>.test$package
6161foo
62- 132
6362139
63+ 146
64646
6565foo
6666DefDef
@@ -76,8 +76,8 @@ test$package
7676Object
7777<empty>.test$package
7878identity
79- 245
80- 269
79+ 252
80+ 276
818111
8282println
8383Apply
@@ -93,8 +93,8 @@ test$package
9393Object
9494<empty>.test$package
9595identity
96- 253
97- 268
96+ 260
97+ 275
989811
9999s
100100Apply
@@ -110,8 +110,8 @@ test$package
110110Object
111111<empty>.test$package
112112identity
113- 209
114- 221
113+ 216
114+ 228
11511510
116116identity
117117DefDef
@@ -127,8 +127,8 @@ test$package
127127Object
128128<empty>.test$package
129129Test
130- 300
131- 323
130+ 307
131+ 330
13213216
133133foo
134134Apply
@@ -144,8 +144,8 @@ test$package
144144Object
145145<empty>.test$package
146146Test
147- 326
148- 342
147+ 333
148+ 349
14914917
150150foo
151151Apply
@@ -161,8 +161,8 @@ test$package
161161Object
162162<empty>.test$package
163163Test
164- 345
165- 374
164+ 352
165+ 381
16616618
167167foo
168168Apply
@@ -178,8 +178,8 @@ test$package
178178Object
179179<empty>.test$package
180180Test
181- 357
182- 373
181+ 364
182+ 380
18318318
184184identity
185185Apply
@@ -195,8 +195,8 @@ test$package
195195Object
196196<empty>.test$package
197197Test
198- 275
199- 289
198+ 282
199+ 296
20020015
201201Test
202202DefDef
Original file line number Diff line number Diff line change @@ -12,25 +12,14 @@ object Test {
1212 })
1313 foo1(a) // OK
1414 foo2( // error
15- a // error
16- )
17- foo3( // error
18- a
15+ a // Ok
1916 )
2017 a // error
2118 }
22- erased def foo2 (a : Int ): Int = {
23- foo0(a) // OK
24- foo1(a) // OK
25- foo2(a) // OK
26- foo3(a) // OK
27- a // OK
28- }
29- erased def foo3 (erased a : Int ): Int = {
19+ erased def foo2 (erased a : Int ): Int = {
3020 foo0(a) // OK
3121 foo1(a) // OK
3222 foo2(a) // OK
33- foo3(a) // OK
3423 a // OK
3524 }
36- }
25+ }
Original file line number Diff line number Diff line change @@ -8,39 +8,26 @@ object Test {
88 )
99 foo1(u) // OK
1010 foo2( // error
11- u // error
12- )
13- foo3( // error
14- u
11+ u // Ok
1512 )
1613 u // error
1714 u // error
1815 }
19- erased def foo2 (a : Int ): Int = {
20- foo0(u) // OK
21- foo1(u) // OK
22- foo2(u) // OK
23- foo3(u) // OK
24- u // warn
25- u // OK
26- }
27- erased def foo3 (erased a : Int ): Int = {
16+ erased def foo2 (erased a : Int ): Int = {
2817 foo0(u) // OK
2918 foo1(u) // OK
3019 foo2(u) // OK
31- foo3(u) // OK
3220 u // warn
3321 u // OK
3422 }
3523
36- erased val foo4 : Int = {
24+ erased val foo3 : Int = {
3725 foo0(u) // OK
3826 foo1(u) // OK
3927 foo2(u) // OK
40- foo3(u) // OK
4128 u // warn
4229 u // OK
4330 }
4431
4532 erased def u : Int = 42
46- }
33+ }
Original file line number Diff line number Diff line change @@ -8,40 +8,27 @@ object Test {
88 )
99 foo1(u()) // OK
1010 foo2( // error
11- u() // error
12- )
13- foo3( // error
14- u()
11+ u() // Ok
1512 )
1613 u() // error
1714 u() // error
1815 }
19- erased def foo2 (a : Int ): Int = {
20- foo0(u()) // OK
21- foo1(u()) // OK
22- foo2(u()) // OK
23- foo3(u()) // OK
24- u() // warn
25- u() // OK
26- }
27- erased def foo3 (erased a : Int ): Int = {
16+ erased def foo2 (erased a : Int ): Int = {
2817 foo0(u()) // OK
2918 foo1(u()) // OK
3019 foo2(u()) // OK
31- foo3(u()) // OK
3220 u() // warn
3321 u() // OK
3422 }
3523
36- erased val foo4 : Int = {
24+ erased val foo3 : Int = {
3725 foo0(u()) // OK
3826 foo1(u()) // OK
3927 foo2(u()) // OK
40- foo3(u()) // OK
4128 println()
4229 u() // warn
4330 u() // OK
4431 }
4532
4633 erased def u (): Int = 42
47- }
34+ }
Original file line number Diff line number Diff line change 22
33object Test {
44 def foo (a : Int )(b : Int , c : Int ) = 42
5- erased def bar (i : Int ): Int = {
5+ erased def bar (erased i : Int ): Int = {
66 println(1 )
77 42
88 }
Original file line number Diff line number Diff line change 1+ import scala .language .experimental .erasedDefinitions
2+
3+ erased def test1 (x : Int ): Int = x // error
4+ erased def test2 (erased x : Int ): Int = x
5+ erased def test3 (erased x : Int , erased y : Int ): Int = x
6+ erased def test4 (erased x : Int , y : Int ): Int = x // error
7+ erased def test5 (x : Int , erased y : Int ): Int = y // error
8+ erased def test6 (x : Int , y : Int ): Int = y // error // error
9+ erased def test7 (erased x : Int )(erased y : Int ): Int = x
10+ erased def test8 (erased x : Int )(y : Int ): Int = x // error
11+ erased def test9 (x : Int )(erased y : Int ): Int = y // error
12+ erased def test10 (x : Int )(y : Int ): Int = y // error // error
Original file line number Diff line number Diff line change @@ -4,7 +4,7 @@ class A1 {
44 @ native private def a : Unit
55}
66trait A2 {
7- erased def i (a : Int ): Int
7+ erased def i (erased a : Int ): Int
88}
99trait A3 {
1010 erased val a : Int
You can’t perform that action at this time.
0 commit comments