Skip to content

Commit e7ebfb6

Browse files
committed
[SR-510] Make closure as enum raw value parses as normal
enum raw value is parsed as a normal expression using `parseExpr()`. However, for a closure, the parser expects a local context that doesn't exist for raw values. We create a temporary context to ensure the closure gets parsed as normal. As a consequence, `parseExpr()` returns normally for closure and correct diagnosis for raw value gets issued.
1 parent 4efdf56 commit e7ebfb6

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

lib/Parse/ParseDecl.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4405,7 +4405,16 @@ ParserStatus Parser::parseDeclEnumCase(ParseDeclOptions Flags,
44054405
{
44064406
CodeCompletionCallbacks::InEnumElementRawValueRAII
44074407
InEnumElementRawValue(CodeCompletion);
4408-
RawValueExpr = parseExpr(diag::expected_expr_enum_case_raw_value);
4408+
if (!CurLocalContext) {
4409+
// A local context is needed for parsing closures. We want to parse
4410+
// them anyways for proper diagnosis.
4411+
LocalContext tempContext{};
4412+
CurLocalContext = &tempContext;
4413+
RawValueExpr = parseExpr(diag::expected_expr_enum_case_raw_value);
4414+
CurLocalContext = nullptr;
4415+
} else {
4416+
RawValueExpr = parseExpr(diag::expected_expr_enum_case_raw_value);
4417+
}
44094418
}
44104419
if (RawValueExpr.hasCodeCompletion()) {
44114420
Status.setHasCodeCompletion();

test/decl/enum/enumtest.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,4 +290,9 @@ func testSimpleEnum() {
290290
let _ : SimpleEnum=.X // expected-error {{'=' must have consistent whitespace on both sides}}
291291
}
292292

293+
enum SR510: String {
294+
case Thing = "thing"
295+
case Bob = {"test"} // expected-error {{raw value for enum case must be a literal}}
296+
}
297+
293298

0 commit comments

Comments
 (0)