Skip to content

Commit

Permalink
Better error for definition followed by keyword
Browse files Browse the repository at this point in the history
Fixes #18750
  • Loading branch information
nicolasstucki committed Oct 24, 2023
1 parent 44a537b commit dc10902
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 0 deletions.
2 changes: 2 additions & 0 deletions compiler/src/dotty/tools/dotc/parsing/Parsers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3598,6 +3598,8 @@ object Parsers {
* | id {`,' id} `:' Type `=' `_' (deprecated in 3.x)
*/
def patDefOrDcl(start: Offset, mods: Modifiers): Tree = atSpan(start, nameStart) {
if in.token != USCORE && isKeyword(in.token) then
syntaxError(ExpectedTokenButFound(IDENTIFIER, in.token), Span(in.offset))
val first = pattern2(Location.InPattern)
var lhs = first match {
case id: Ident if in.token == COMMA =>
Expand Down
104 changes: 104 additions & 0 deletions tests/neg/i18750.check
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
-- [E040] Syntax Error: tests/neg/i18750.scala:3:4 ---------------------------------------------------------------------
3 |val do = 23 // error
| ^
| an identifier expected, but 'do' found
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'do' as identifier, you may put it in backticks: `do`.
---------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:4:4 ---------------------------------------------------------------------
4 |val if = 23 // error
| ^
| an identifier expected, but 'if' found
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'if' as identifier, you may put it in backticks: `if`.
---------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:5:4 ---------------------------------------------------------------------
5 |val val = 23 // error
| ^
| an identifier expected, but 'val' found
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'val' as identifier, you may put it in backticks: `val`.
---------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:6:7 ---------------------------------------------------------------------
6 |val a, if = 23 // error
| ^^
| an identifier expected, but 'if' found
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'if' as identifier, you may put it in backticks: `if`.
---------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:8:4 ---------------------------------------------------------------------
8 |def do; // error
| ^^
| an identifier expected, but 'do' found
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'do' as identifier, you may put it in backticks: `do`.
---------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:9:4 ---------------------------------------------------------------------
9 |var do; // error
| ^
| an identifier expected, but 'do' found
|---------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'do' as identifier, you may put it in backticks: `do`.
---------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:10:6 --------------------------------------------------------------------
10 |class do; // error
| ^^
| an identifier expected, but 'do' found
|--------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'do' as identifier, you may put it in backticks: `do`.
--------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:11:7 --------------------------------------------------------------------
11 |object if; // error // error
| ^^
| an identifier expected, but 'if' found
|--------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'if' as identifier, you may put it in backticks: `if`.
--------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:12:6 --------------------------------------------------------------------
12 |trait else; // error
| ^^^^
| an identifier expected, but 'else' found
|--------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'else' as identifier, you may put it in backticks: `else`.
--------------------------------------------------------------------------------------------------------------------
-- [E040] Syntax Error: tests/neg/i18750.scala:13:5 --------------------------------------------------------------------
13 |type for; // error
| ^^^
| an identifier expected, but 'for' found
|--------------------------------------------------------------------------------------------------------------------
| Explanation (enabled by `-explain`)
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
| If you want to use 'for' as identifier, you may put it in backticks: `for`.
--------------------------------------------------------------------------------------------------------------------
-- [E161] Naming Error: tests/neg/i18750.scala:11:0 --------------------------------------------------------------------
11 |object if; // error // error
|^
|<error> clashes with class <error> in tests/neg/i18750.scala; the two must be defined together
13 changes: 13 additions & 0 deletions tests/neg/i18750.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//> using options -explain

val do = 23 // error
val if = 23 // error
val val = 23 // error
val a, if = 23 // error

def do; // error
var do; // error
class do; // error
object if; // error // error
trait else; // error
type for; // error

0 comments on commit dc10902

Please sign in to comment.