File tree 9 files changed +54
-72
lines changed
compiler/src/dotty/tools/dotc/transform
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 =>
553
553
report.error(" classes that extend MacroAnnotation must not be inner/local classes" , sym.srcPos)
554
554
555
555
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
+
556
562
if tree.symbol.is(Erased , butNot = Macro ) then
563
+ checkOnlyErasedParams()
557
564
val tpe = tree.rhs.tpe
558
565
if tpe.derivesFrom(defn.NothingClass ) then
559
566
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
2
2
3
3
erased def parameterless : String = " y"
4
4
5
- erased def e (x : String ): String = " x"
5
+ erased def e (erased x : String ): String = " x"
6
6
def foo (erased a : String )(b : String ): String =
7
7
println(s " foo(a)( $b) " )
8
8
b
Original file line number Diff line number Diff line change @@ -25,8 +25,8 @@ test$package
25
25
Object
26
26
<empty>.test$package
27
27
foo
28
- 181
29
- 203
28
+ 188
29
+ 210
30
30
7
31
31
println
32
32
Apply
@@ -42,8 +42,8 @@ test$package
42
42
Object
43
43
<empty>.test$package
44
44
foo
45
- 189
46
- 202
45
+ 196
46
+ 209
47
47
7
48
48
s
49
49
Apply
@@ -59,8 +59,8 @@ test$package
59
59
Object
60
60
<empty>.test$package
61
61
foo
62
- 132
63
62
139
63
+ 146
64
64
6
65
65
foo
66
66
DefDef
@@ -76,8 +76,8 @@ test$package
76
76
Object
77
77
<empty>.test$package
78
78
identity
79
- 245
80
- 269
79
+ 252
80
+ 276
81
81
11
82
82
println
83
83
Apply
@@ -93,8 +93,8 @@ test$package
93
93
Object
94
94
<empty>.test$package
95
95
identity
96
- 253
97
- 268
96
+ 260
97
+ 275
98
98
11
99
99
s
100
100
Apply
@@ -110,8 +110,8 @@ test$package
110
110
Object
111
111
<empty>.test$package
112
112
identity
113
- 209
114
- 221
113
+ 216
114
+ 228
115
115
10
116
116
identity
117
117
DefDef
@@ -127,8 +127,8 @@ test$package
127
127
Object
128
128
<empty>.test$package
129
129
Test
130
- 300
131
- 323
130
+ 307
131
+ 330
132
132
16
133
133
foo
134
134
Apply
@@ -144,8 +144,8 @@ test$package
144
144
Object
145
145
<empty>.test$package
146
146
Test
147
- 326
148
- 342
147
+ 333
148
+ 349
149
149
17
150
150
foo
151
151
Apply
@@ -161,8 +161,8 @@ test$package
161
161
Object
162
162
<empty>.test$package
163
163
Test
164
- 345
165
- 374
164
+ 352
165
+ 381
166
166
18
167
167
foo
168
168
Apply
@@ -178,8 +178,8 @@ test$package
178
178
Object
179
179
<empty>.test$package
180
180
Test
181
- 357
182
- 373
181
+ 364
182
+ 380
183
183
18
184
184
identity
185
185
Apply
@@ -195,8 +195,8 @@ test$package
195
195
Object
196
196
<empty>.test$package
197
197
Test
198
- 275
199
- 289
198
+ 282
199
+ 296
200
200
15
201
201
Test
202
202
DefDef
Original file line number Diff line number Diff line change @@ -12,25 +12,14 @@ object Test {
12
12
})
13
13
foo1(a) // OK
14
14
foo2( // error
15
- a // error
16
- )
17
- foo3( // error
18
- a
15
+ a // Ok
19
16
)
20
17
a // error
21
18
}
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 = {
30
20
foo0(a) // OK
31
21
foo1(a) // OK
32
22
foo2(a) // OK
33
- foo3(a) // OK
34
23
a // OK
35
24
}
36
- }
25
+ }
Original file line number Diff line number Diff line change @@ -8,39 +8,26 @@ object Test {
8
8
)
9
9
foo1(u) // OK
10
10
foo2( // error
11
- u // error
12
- )
13
- foo3( // error
14
- u
11
+ u // Ok
15
12
)
16
13
u // error
17
14
u // error
18
15
}
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 = {
28
17
foo0(u) // OK
29
18
foo1(u) // OK
30
19
foo2(u) // OK
31
- foo3(u) // OK
32
20
u // warn
33
21
u // OK
34
22
}
35
23
36
- erased val foo4 : Int = {
24
+ erased val foo3 : Int = {
37
25
foo0(u) // OK
38
26
foo1(u) // OK
39
27
foo2(u) // OK
40
- foo3(u) // OK
41
28
u // warn
42
29
u // OK
43
30
}
44
31
45
32
erased def u : Int = 42
46
- }
33
+ }
Original file line number Diff line number Diff line change @@ -8,40 +8,27 @@ object Test {
8
8
)
9
9
foo1(u()) // OK
10
10
foo2( // error
11
- u() // error
12
- )
13
- foo3( // error
14
- u()
11
+ u() // Ok
15
12
)
16
13
u() // error
17
14
u() // error
18
15
}
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 = {
28
17
foo0(u()) // OK
29
18
foo1(u()) // OK
30
19
foo2(u()) // OK
31
- foo3(u()) // OK
32
20
u() // warn
33
21
u() // OK
34
22
}
35
23
36
- erased val foo4 : Int = {
24
+ erased val foo3 : Int = {
37
25
foo0(u()) // OK
38
26
foo1(u()) // OK
39
27
foo2(u()) // OK
40
- foo3(u()) // OK
41
28
println()
42
29
u() // warn
43
30
u() // OK
44
31
}
45
32
46
33
erased def u (): Int = 42
47
- }
34
+ }
Original file line number Diff line number Diff line change 2
2
3
3
object Test {
4
4
def foo (a : Int )(b : Int , c : Int ) = 42
5
- erased def bar (i : Int ): Int = {
5
+ erased def bar (erased i : Int ): Int = {
6
6
println(1 )
7
7
42
8
8
}
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 {
4
4
@ native private def a : Unit
5
5
}
6
6
trait A2 {
7
- erased def i (a : Int ): Int
7
+ erased def i (erased a : Int ): Int
8
8
}
9
9
trait A3 {
10
10
erased val a : Int
You can’t perform that action at this time.
0 commit comments