Skip to content

Commit 5eab7e5

Browse files
authored
Merge pull request swiftlang#2370 from ahoppen/ahoppen/sendable-no-args
Never parse arguments of a `Sendable` attribute
2 parents a082866 + fed2357 commit 5eab7e5

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

Sources/SwiftParser/Attributes.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ extension Parser {
6262
case exclusivity
6363
case inline
6464
case objc
65+
case Sendable
6566
case transpose
6667

6768
init?(lexeme: Lexer.Lexeme, experimentalFeatures: Parser.ExperimentalFeatures) {
@@ -97,6 +98,7 @@ extension Parser {
9798
case TokenSpec(.exclusivity): self = .exclusivity
9899
case TokenSpec(.inline): self = .inline
99100
case TokenSpec(.objc): self = .objc
101+
case TokenSpec(.Sendable): self = .Sendable
100102
case TokenSpec(.transpose): self = .transpose
101103
default:
102104
return nil
@@ -136,6 +138,7 @@ extension Parser {
136138
case .exclusivity: return .keyword(.exclusivity)
137139
case .inline: return .keyword(.inline)
138140
case .objc: return .keyword(.objc)
141+
case .Sendable: return .keyword(.Sendable)
139142
case .transpose: return .keyword(.transpose)
140143
}
141144
}
@@ -163,6 +166,7 @@ extension Parser {
163166
case required
164167
case customAttribute
165168
case optional
169+
case noArgument
166170
}
167171

168172
mutating func parseAttribute(
@@ -179,6 +183,8 @@ extension Parser {
179183
shouldParseArgument = self.withLookahead { $0.atCustomAttributeArgument() } && self.at(TokenSpec(.leftParen, allowAtStartOfLine: false))
180184
case .optional:
181185
shouldParseArgument = self.at(.leftParen)
186+
case .noArgument:
187+
shouldParseArgument = false
182188
}
183189
if shouldParseArgument {
184190
let (unexpectedBeforeLeftParen, leftParen) = self.expect(.leftParen)
@@ -336,6 +342,10 @@ extension Parser {
336342
arena: self.arena
337343
)
338344
)
345+
case .Sendable:
346+
return parseAttribute(argumentMode: .noArgument) { parser in
347+
preconditionFailure("Sendable has no argument")
348+
}
339349
case nil:
340350
return parseAttribute(argumentMode: .customAttribute) { parser in
341351
let arguments = parser.parseArgumentListElements(pattern: .none)

Tests/SwiftParserTest/ExpressionTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2984,4 +2984,11 @@ final class StatementExpressionTests: ParserTestCase {
29842984
fixedSource: #"[1: "hello", 2: "world"]"#
29852985
)
29862986
}
2987+
2988+
func testSendableAttributeInClosure() {
2989+
assertParse(
2990+
"f { @Sendable (e: Int) in }",
2991+
substructure: AttributeSyntax(attributeName: TypeSyntax("Sendable"))
2992+
)
2993+
}
29872994
}

0 commit comments

Comments
 (0)