File tree Expand file tree Collapse file tree 3 files changed +39
-3
lines changed
compiler/src/dotty/tools/dotc/transform Expand file tree Collapse file tree 3 files changed +39
-3
lines changed Original file line number Diff line number Diff line change @@ -4,6 +4,7 @@ package transform
44
55import dotty .tools .dotc .core .Contexts ._
66import dotty .tools .dotc .core .Decorators ._
7+ import dotty .tools .dotc .core .Symbols ._
78import dotty .tools .dotc .core .Flags ._
89import dotty .tools .dotc .core .Types ._
910import dotty .tools .dotc .transform .MegaPhase .MiniPhase
@@ -37,7 +38,10 @@ class InlineVals extends MiniPhase:
3738 if ! isPureExpr(rhs) then
3839 val details = if enclosingInlineds.isEmpty then " " else em " but was: $rhs"
3940 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)
4347 }
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