File tree 3 files changed +39
-3
lines changed
compiler/src/dotty/tools/dotc/transform 3 files changed +39
-3
lines changed Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ package transform
4
4
5
5
import dotty .tools .dotc .core .Contexts ._
6
6
import dotty .tools .dotc .core .Decorators ._
7
+ import dotty .tools .dotc .core .Symbols ._
7
8
import dotty .tools .dotc .core .Flags ._
8
9
import dotty .tools .dotc .core .Types ._
9
10
import dotty .tools .dotc .transform .MegaPhase .MiniPhase
@@ -37,7 +38,10 @@ class InlineVals extends MiniPhase:
37
38
if ! isPureExpr(rhs) then
38
39
val details = if enclosingInlineds.isEmpty then " " else em " but was: $rhs"
39
40
report.error(s " inline value must be pure $details" , rhs.srcPos)
40
- case _ =>
41
- val pos = if tpt.span.isZeroExtent then rhs.srcPos else tpt.srcPos
42
- report.error(em " inline value must have a literal constant type " , pos)
41
+ case tp =>
42
+ if tp.derivesFrom(defn.StringClass ) || defn.ScalaValueClasses ().exists(tp.derivesFrom(_)) then
43
+ val pos = if tpt.span.isZeroExtent then rhs.srcPos else tpt.srcPos
44
+ report.error(em " inline value must have a literal constant type " , pos)
45
+ else
46
+ report.error(em " inline value must contain a literal constant value. \n\n To inline more complex types consider using `inline def` " , rhs)
43
47
}
Original file line number Diff line number Diff line change
1
+ -- Error: tests/neg/i11854.scala:4:14 ----------------------------------------------------------------------------------
2
+ 4 |inline val j: Int = 2 // error
3
+ | ^^^
4
+ | inline value must have a literal constant type
5
+ -- Error: tests/neg/i11854.scala:5:14 ----------------------------------------------------------------------------------
6
+ 5 |inline val b: Boolean = true // error
7
+ | ^^^^^^^
8
+ | inline value must have a literal constant type
9
+ -- Error: tests/neg/i11854.scala:6:14 ----------------------------------------------------------------------------------
10
+ 6 |inline val s: String = "" // error
11
+ | ^^^^^^
12
+ | inline value must have a literal constant type
13
+ -- Error: tests/neg/i11854.scala:7:18 ----------------------------------------------------------------------------------
14
+ 7 |inline val bagA = new Bag(Seq('a', 'b', 'c')) // error
15
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
16
+ | inline value must contain a literal constant value.
17
+ |
18
+ | To inline more complex types consider using `inline def`
19
+ -- Error: tests/neg/i11854.scala:8:23 ----------------------------------------------------------------------------------
20
+ 8 |inline val bagB: Bag = new Bag(Seq('a', 'b', 'c')) // error
21
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
22
+ | inline value must contain a literal constant value.
23
+ |
24
+ | To inline more complex types consider using `inline def`
Original file line number Diff line number Diff line change
1
+ class Bag (seq : Seq [Char ])
2
+
3
+ inline val i = 2
4
+ inline val j : Int = 2 // error
5
+ inline val b : Boolean = true // error
6
+ inline val s : String = " " // error
7
+ inline val bagA = new Bag (Seq ('a' , 'b' , 'c' )) // error
8
+ inline val bagB : Bag = new Bag (Seq ('a' , 'b' , 'c' )) // error
You can’t perform that action at this time.
0 commit comments