-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Parse empty arguments in (invalid) Apply
more often
#14463
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -249,11 +249,11 @@ object Parsers { | |
|
||
/** Skip on error to next safe point. | ||
*/ | ||
protected def skip(): Unit = | ||
protected def skip(stopAtComma: Boolean): Unit = | ||
val lastRegion = in.currentRegion | ||
def atStop = | ||
in.token == EOF | ||
|| skipStopTokens.contains(in.token) && (in.currentRegion eq lastRegion) | ||
|| ((stopAtComma && in.token == COMMA) || skipStopTokens.contains(in.token)) && (in.currentRegion eq lastRegion) | ||
while !atStop do | ||
in.nextToken() | ||
lastErrorOffset = in.offset | ||
|
@@ -278,7 +278,7 @@ object Parsers { | |
if (in.token == EOF) incompleteInputError(msg) | ||
else | ||
syntaxError(msg, offset) | ||
skip() | ||
skip(stopAtComma = true) | ||
|
||
/** Consume one token of the specified type, or | ||
* signal an error if it is not there. | ||
|
@@ -346,7 +346,7 @@ object Parsers { | |
false // it's a statement that might be legal in an outer context | ||
else | ||
in.nextToken() // needed to ensure progress; otherwise we might cycle forever | ||
skip() | ||
skip(stopAtComma=false) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here, we are explicitly looking to skip to a place that should end a statement, which a |
||
true | ||
|
||
in.observeOutdented() | ||
|
@@ -881,7 +881,8 @@ object Parsers { | |
val next = in.lookahead.token | ||
next == LBRACKET || next == LPAREN | ||
|
||
/** Is current ident a `*`, and is it followed by a `)` or `, )`? */ | ||
/** Is current ident a `*`, and is it followed by a `)`, `, )`, `,EOF`? The latter two are not | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this is a correct use of this function, or at least does not make it worse than it was before. Without this, the special handling for EOF in the comma lookahead is unnecessary, and also leads to a better error when a comma is followed by an EOF. |
||
syntactically valid, but we need to include them here for error recovery. */ | ||
def followingIsVararg(): Boolean = | ||
in.isIdent(nme.raw.STAR) && { | ||
val lookahead = in.LookaheadScanner() | ||
|
@@ -890,7 +891,7 @@ object Parsers { | |
|| lookahead.token == COMMA | ||
&& { | ||
lookahead.nextToken() | ||
lookahead.token == RPAREN | ||
lookahead.token == RPAREN || lookahead.token == EOF | ||
} | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
object Test: | ||
case class Widget(name: String, other: Int = 5) | ||
Widget(name = "foo", // error // error | ||
tgodzik marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
class A[T] | ||
object o { | ||
// Testing compiler crash, this test should be modified when named type argument are completely implemented | ||
val x: A[T=Int, T=Int] = ??? // error: ']' expected, but '=' found | ||
val x: A[T=Int, T=Int] = ??? // error: ']' expected, but '=' found // error | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also here, there seems to be no message accompanying the message There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The second message here is not ideal:
This is arguably a regression. I'm not quite sure what's happening, but I noticed there were a bunch of untagged, less-than-ideal error messages elsewhere so I left it. Think it's worth fixing here? Leaving a TODO? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure, if there are other wierd errors then I guess we can create a Todo with an issue to improve this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I looked into it a bit more. When parsing a comma-separated list, if thing you're looking for (in this case, a type tree) ends before you hit a comma, the parser thinks you're done the list, so the parser reads There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I pushed a change that gets rid of this (bad) error by changing There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we remove the added error then? |
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
-- [E040] Syntax Error: tests/neg/t1625.scala:2:20 --------------------------------------------------------------------- | ||
2 | def foo(x: String*, y: String*, c: String*): Int // error: an identifier expected, but ',' found // error: an identifier expected, but ',' found | ||
| ^ | ||
| an identifier expected, but ',' found | ||
-- [E040] Syntax Error: tests/neg/t1625.scala:2:32 --------------------------------------------------------------------- | ||
2 | def foo(x: String*, y: String*, c: String*): Int // error: an identifier expected, but ',' found // error: an identifier expected, but ',' found | ||
| ^ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is an example of better error messages IMHO: you get an error on both invalid occurrences. |
||
| an identifier expected, but ',' found |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
trait T3 { | ||
def foo(x: String*, y: String*, c: String*): Int // error: an identifier expected, but ',' found | ||
} | ||
def foo(x: String*, y: String*, c: String*): Int // error: an identifier expected, but ',' found // error: an identifier expected, but ',' found | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
-- [E032] Syntax Error: tests/neg/t5702-neg-bad-and-wild.scala:10:22 --------------------------------------------------- | ||
10 | case List(1, _*,) => // error: pattern expected // error | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- [E032] Syntax Error: tests/neg/t5702-neg-bad-and-wild.scala:12:23 --------------------------------------------------- | ||
12 | case List(1, _*3,) => // error: pattern expected // error // error | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- [E032] Syntax Error: tests/neg/t5702-neg-bad-and-wild.scala:15:18 --------------------------------------------------- | ||
15 | case List(x*, 1) => // error: pattern expected | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- [E031] Syntax Error: tests/neg/t5702-neg-bad-and-wild.scala:17:18 --------------------------------------------------- | ||
17 | case (1, x: _*) => // error: bad use of _* (sequence pattern not allowed) | ||
| ^ | ||
| * can be used only for last argument | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- [E032] Syntax Error: tests/neg/t5702-neg-bad-and-wild.scala:23:17 --------------------------------------------------- | ||
23 | val K(ns @ _*, x) = k // error: pattern expected | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- Error: tests/neg/t5702-neg-bad-and-wild.scala:10:21 ----------------------------------------------------------------- | ||
10 | case List(1, _*,) => // error: pattern expected // error | ||
| ^ | ||
| Values of types Null and Int cannot be compared with == or != | ||
-- [E006] Not Found Error: tests/neg/t5702-neg-bad-and-wild.scala:12:20 ------------------------------------------------ | ||
12 | case List(1, _*3,) => // error: pattern expected // error // error | ||
| ^ | ||
| Not found: * | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- Error: tests/neg/t5702-neg-bad-and-wild.scala:12:22 ----------------------------------------------------------------- | ||
12 | case List(1, _*3,) => // error: pattern expected // error // error | ||
| ^ | ||
| Values of types Null and Int cannot be compared with == or != |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
-- [E032] Syntax Error: tests/neg/t5702-neg-bad-brace.scala:8:21 ------------------------------------------------------- | ||
8 | case List(1, _*} => // error: pattern expected | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- [E040] Syntax Error: tests/neg/t5702-neg-bad-brace.scala:11:0 ------------------------------------------------------- | ||
11 |} // error: eof expected, but '}' found | ||
|^ | ||
|eof expected, but '}' found | ||
tgodzik marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
|
||
object Test { | ||
|
||
def main(args: Array[String]) = { | ||
val is = List(1,2,3) | ||
|
||
is match { | ||
case List(1, _*} => // error: pattern expected | ||
} | ||
} | ||
} // error: eof expected, but '}' found |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
-- [E032] Syntax Error: tests/neg/trailing-comma-pattern.scala:3:8 ----------------------------------------------------- | ||
3 |// error | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
object Test: | ||
val List(x, y, _*, | ||
// error |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
-- [E032] Syntax Error: tests/neg/trailing-comma-pattern2.scala:2:21 --------------------------------------------------- | ||
2 | val List(x, y, _*, ) // error | ||
| ^ | ||
| pattern expected | ||
| | ||
| longer explanation available when compiling with `-explain` | ||
-- [E040] Syntax Error: tests/neg/trailing-comma-pattern2.scala:3:8 ---------------------------------------------------- | ||
3 |// error | ||
| ^ | ||
| '=' expected, but unindent found |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
object Test: | ||
val List(x, y, _*, ) // error | ||
// error |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
object Test: | ||
val List(x, y, _*, | ||
) = List(1, 2, 3) |
This file was deleted.
This file was deleted.
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line makes it so we skip to the next argument if we encounter an error in a comma separated list.