File tree Expand file tree Collapse file tree 5 files changed +64
-2
lines changed
compiler/src/dotty/tools/dotc/typer
docs/docs/reference/metaprogramming Expand file tree Collapse file tree 5 files changed +64
-2
lines changed Original file line number Diff line number Diff line change @@ -888,9 +888,12 @@ trait Checking {
888888 // final vals can be marked inline even if they're not pure, see Typer#patchFinalVals
889889 val purityLevel = if (sym.is(Final )) Idempotent else Pure
890890 tpt.tpe.widenTermRefExpr.dealias match
891- case tp : ConstantType if exprPurity(tree) >= purityLevel => // ok
891+ case tp : ConstantType =>
892+ if ! (exprPurity(tree) >= purityLevel) then
893+ ctx.error(em " inline value must be pure " , tree.sourcePos)
892894 case _ =>
893- ctx.error(em " type of inline must be a known value " , tree.sourcePos)
895+ val pos = if tpt.span.isZeroExtent then tree.sourcePos else tpt.sourcePos
896+ ctx.error(em " inline value must have a literal constant type " , pos)
894897 }
895898
896899 /** A hook to exclude selected symbols from double declaration check */
Original file line number Diff line number Diff line change @@ -228,6 +228,25 @@ constant expressions in the sense defined by the [SLS §
228228including _ platform-specific_ extensions such as constant folding of pure
229229numeric computations.
230230
231+ An inline value must have a literal type such as ` 1 ` or ` true ` .
232+ ``` scala
233+ inline val four = 4
234+ // equivalent to
235+ inline val four : 4 = 4
236+ ```
237+
238+ It is also possible to have inline vals of types that do not have a syntax, such as ` Short(4) ` .
239+
240+ ``` scala
241+ trait InlineConstants {
242+ inline val myShort : Short
243+ }
244+
245+ object Constants extends InlineConstants {
246+ inline val myShort /* : Short(4)*/ = 4
247+ }
248+ ```
249+
231250## Transparent Inline Methods
232251
233252Inline methods can additionally be declared ` transparent ` .
Original file line number Diff line number Diff line change 1+ -- Error: tests/neg/i8841.scala:2:20 -----------------------------------------------------------------------------------
2+ 2 | inline val log1 : Boolean = false // error
3+ | ^^^^^^^
4+ | inline value must have a literal constant type
5+ -- Error: tests/neg/i8841.scala:3:20 -----------------------------------------------------------------------------------
6+ 3 | inline val log2 = true: Boolean // error
7+ | ^^^^^^^^^^^^^
8+ | inline value must have a literal constant type
9+ -- Error: tests/neg/i8841.scala:4:28 -----------------------------------------------------------------------------------
10+ 4 | inline val log3: false = { println(); false } // error
11+ | ^^^^^^^^^^^^^^^^^^^^
12+ | inline value must be pure
Original file line number Diff line number Diff line change 1+ object Foo {
2+ inline val log1 : Boolean = false // error
3+ inline val log2 = true : Boolean // error
4+ inline val log3 : false = { println(); false } // error
5+ }
Original file line number Diff line number Diff line change 1+ trait InlineConstants {
2+ inline val myInlinedBoolean : Boolean
3+ inline val myInlinedByte : Byte
4+ inline val myInlinedShort : Short
5+ inline val myInlinedInt : Int
6+ inline val myInlinedLong : Long
7+ inline val myInlinedFloat : Float
8+ inline val myInlinedDouble : Double
9+ inline val myInlinedChar : Char
10+ inline val myInlinedString : String
11+ }
12+
13+ object Constants extends InlineConstants {
14+ inline val myInlinedBoolean = true
15+ inline val myInlinedByte = 1
16+ inline val myInlinedShort = 2
17+ inline val myInlinedInt = 3
18+ inline val myInlinedLong = 4
19+ inline val myInlinedFloat = 5
20+ inline val myInlinedDouble = 6
21+ inline val myInlinedChar = 'a'
22+ inline val myInlinedString = " abc"
23+ }
You can’t perform that action at this time.
0 commit comments