Skip to content

5.10 compiler emits syntax error on code in #if(compiler>=6.0) block under specific conditions #79285

Open
@gwynne

Description

@gwynne

Description

When run in the swift:5.10-noble Docker image for x86_64, the compiler emits a nonsensical syntax error for code enclosed in a #if compiler(>=6.0) block which uses sending in a specific way (see reproduction below). The complete compiler output for the given repro is:

test.swift:4:1: error: extraneous code at top level
) async throws -> sending R {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test.swift:1:1: error: new Swift parser generated errors for code that C++ parser accepted
#if compiler(>=6.0)
^
error: fatalError

This issue does not occur if run on any other OS (including any other version of Ubuntu), nor does it appear to occur on arm64, even in Noble.

This bug appears when using the 5.10.1-RELEASE compiler on x86_64 Ubuntu Noble (24.04) to build AsyncHTTPClient as of the 1.25.0 release, in the file StructuredConcurrencyHelpers.swift. See also async-http-client#809.

Reproduction

#if compiler(>=6.0)
func f<R>(
    _ body: () async throws -> sending R
) async throws -> sending R {
    let r = try await body()
    return r
}
#endif

Expected behavior

This code should compile as written.

It is worth noting that even a trivial modification of whitespace is sufficient to eliminate the build failure. For example, this version of the same code (a single newline has been removed) builds correctly:

#if compiler(>=6.0)
func f<R>(    _ body: () async throws -> sending R
) async throws -> sending R {
    let r = try await body()
    return r
}
#endif

Environment

Swift version 5.10.1 (swift-5.10.1-RELEASE)
Target: x86_64-unknown-linux-gnu

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    assertion failureBug → crash: An assertion failurebugA deviation from expected or documented behavior. Also: expected but undesirable behavior.parserArea → compiler: The legacy C++ parser† libswiftSyntaxArchive • Area → compiler: the once-integrated C++ Syntax library succeeded by SwiftSyntax

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions