Skip to content

Commit

Permalink
Add an error message for local final defs
Browse files Browse the repository at this point in the history
Co-Authored-By: Eugene Flesselle <[email protected]>
Co-Authored-By: anna herlihy <[email protected]>
Co-Authored-By: Oliver Bračevac <[email protected]>
  • Loading branch information
4 people committed Jun 11, 2024
1 parent af6beec commit 3b2f444
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 0 deletions.
1 change: 1 addition & 0 deletions compiler/src/dotty/tools/dotc/parsing/Parsers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4560,6 +4560,7 @@ object Parsers {
for (imod <- implicitMods.mods) mods = addMod(mods, imod)
if (mods.is(Final))
// A final modifier means the local definition is "class-like". // FIXME: Deal with modifiers separately
if isDclIntro && in.token != GIVEN then syntaxError(FinalLocalDef())
tmplDef(start, mods)
else
defOrDcl(start, mods)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ enum ErrorMessageID(val isActive: Boolean = true) extends java.lang.Enum[ErrorMe
case ContextBoundCompanionNotValueID // errorNumber: 196
case InlinedAnonClassWarningID // errorNumber: 197
case UnusedSymbolID // errorNumber: 198
case FinalLocalDefID // errorNumber: 199

def errorNumber = ordinal - 1

Expand Down
6 changes: 6 additions & 0 deletions compiler/src/dotty/tools/dotc/reporting/messages.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1850,6 +1850,12 @@ class ExpectedStartOfTopLevelDefinition()(using Context)
i"You have to provide either ${hl("class")}, ${hl("trait")}, ${hl("object")}, or ${hl("enum")} definitions after modifiers"
}

class FinalLocalDef()(using Context)
extends SyntaxMsg(FinalLocalDefID) {
def msg(using Context) = i"The ${hl("final")} modifier is not allowed on local definitions"
def explain(using Context) = ""
}

class NoReturnFromInlineable(owner: Symbol)(using Context)
extends SyntaxMsg(NoReturnFromInlineableID) {
def msg(using Context) = i"No explicit ${hl("return")} allowed from inlineable $owner"
Expand Down
26 changes: 26 additions & 0 deletions tests/neg/17579.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
-- [E199] Syntax Error: tests/neg/17579.scala:4:10 ---------------------------------------------------------------------
4 | final val v1 = 42 // error
| ^^^
| The final modifier is not allowed on local definitions
-- [E199] Syntax Error: tests/neg/17579.scala:5:15 ---------------------------------------------------------------------
5 | final lazy val v2 = 42 // error
| ^^^
| The final modifier is not allowed on local definitions
-- [E088] Syntax Error: tests/neg/17579.scala:6:10 ---------------------------------------------------------------------
6 | final private val v3 = 42 // error
| ^^^^^^^
| Expected start of definition
|
| longer explanation available when compiling with `-explain`
-- [E199] Syntax Error: tests/neg/17579.scala:7:10 ---------------------------------------------------------------------
7 | final def v4 = 42 // error
| ^^^
| The final modifier is not allowed on local definitions
-- [E199] Syntax Error: tests/neg/17579.scala:8:10 ---------------------------------------------------------------------
8 | final var v5 = 42 // error
| ^^^
| The final modifier is not allowed on local definitions
-- [E199] Syntax Error: tests/neg/17579.scala:9:10 ---------------------------------------------------------------------
9 | final type Foo = String // error
| ^^^^
| The final modifier is not allowed on local definitions
10 changes: 10 additions & 0 deletions tests/neg/17579.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class C:
final var v = 42 // ok
def f =
final val v1 = 42 // error
final lazy val v2 = 42 // error
final private val v3 = 42 // error
final def v4 = 42 // error
final var v5 = 42 // error
final type Foo = String // error
final given String = ???

0 comments on commit 3b2f444

Please sign in to comment.