From d4f7b3e8a4799ded6f5ad0a1ebfd7e095a493a59 Mon Sep 17 00:00:00 2001 From: Doug Gregor Date: Mon, 24 Feb 2025 16:56:52 -0800 Subject: [PATCH] [SE-0458] Improve disambiguation for "unsafe" effect on for..in loop --- Sources/SwiftParser/Statements.swift | 4 ++-- Tests/SwiftParserTest/StatementTests.swift | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Sources/SwiftParser/Statements.swift b/Sources/SwiftParser/Statements.swift index 4f9905a13df..bf135e7d73d 100644 --- a/Sources/SwiftParser/Statements.swift +++ b/Sources/SwiftParser/Statements.swift @@ -574,8 +574,8 @@ extension Parser { if let modifierKeyword = ExpressionModifierKeyword( lexeme: self.currentToken, experimentalFeatures: self.experimentalFeatures - ), modifierKeyword == .unsafe, !self.peek(isAt: .keyword(.in)) { - unsafeKeyword = self.consumeAnyToken(remapping: .keyword) + ), modifierKeyword == .unsafe, !self.peek(isAt: .keyword(.in), .colon) { + unsafeKeyword = self.expectWithoutRecovery(.keyword(.unsafe)) } else { unsafeKeyword = nil } diff --git a/Tests/SwiftParserTest/StatementTests.swift b/Tests/SwiftParserTest/StatementTests.swift index 23801dfa04b..8c7080de2c9 100644 --- a/Tests/SwiftParserTest/StatementTests.swift +++ b/Tests/SwiftParserTest/StatementTests.swift @@ -968,5 +968,15 @@ final class StatementTests: ParserTestCase { "for try await unsafe in e { }", experimentalFeatures: [.unsafeExpression] ) + + assertParse( + "for unsafe in e { }", + experimentalFeatures: [.unsafeExpression] + ) + + assertParse( + "for unsafe: Int in e { }", + experimentalFeatures: [.unsafeExpression] + ) } }