Skip to content

Conversation

@grynspan
Copy link
Contributor

@grynspan grynspan commented Jun 26, 2025

This PR adds overloads of the #expect(throws:) and #require(throws:) macros that take synchronous closures. This is necessary due to a change in the compiler in Swift 6.2 that improves type checking on closures passed to macros. The change is a good thing, but it means that the compiler infers the type of closures passed to these macros as async even when they are synchronous and developers will now get warnings under some circumstances.

This PR does not constitute an API change. The new overloads are identical to their async peers and there is no change in the underlying macro expansion logic at compile time or runtime. The PR serves solely to suppress new spurious warnings that were not emitted in Swift 6.1 or earlier.

Resolves #1177.
Resolves rdar://149299786.

Checklist:

  • Code and documentation should follow the style of the Style Guide.
  • If public symbols are renamed or modified, DocC references should be updated.

This PR adds overloads of the `#expect(throws:)` and `#require(throws:)` macros
that take synchronous closures. This is necessary due to a change in the
compiler in Swift 6.2 that improves type checking on closures passed to macros.
The change is a good thing, but it means that the compiler infers the type of
closures passed to these macros as `async` even when they are synchronous and
developers will now get warnings under some circumstances.

This PR does not constitute an API change. The new overloads are identical to
their `async` peers and there is no change in the underlying macro expansion
logic at compile time or runtime. The PR serves solely to suppress new spurious
warnings that were not emitted in Swift 6.1 or earlier.

Resolves #1177.
Resolves rdar://149299786.
@grynspan grynspan added this to the Swift 6.x milestone Jun 26, 2025
@grynspan grynspan self-assigned this Jun 26, 2025
@grynspan grynspan added the bug 🪲 Something isn't working label Jun 26, 2025
@grynspan grynspan added concurrency 🔀 Swift concurrency/sendability issues workaround Workaround for an issue in another component (may need to revert later) macros 🔭 Related to Swift macros such as @Test or #expect labels Jun 26, 2025
@grynspan
Copy link
Contributor Author

@swift-ci test

@grynspan
Copy link
Contributor Author

@swift-ci test

@stmontgomery
Copy link
Contributor

For tracking purposes, the relevant compiler diagnostic was downgraded to a warning in swiftlang/swift#80853.

@grynspan grynspan merged commit e895fc8 into main Jun 26, 2025
3 checks passed
@grynspan grynspan deleted the jgrynspan/1177-add-expect-throws-sync-overloads branch June 26, 2025 17:02
grynspan added a commit that referenced this pull request Jun 26, 2025
This PR adds overloads of the `#expect(throws:)` and `#require(throws:)`
macros that take synchronous closures. This is necessary due to a change
in the compiler in Swift 6.2 that improves type checking on closures
passed to macros. The change is a good thing, but it means that the
compiler infers the type of closures passed to these macros as `async`
even when they are synchronous and developers will now get warnings
under some circumstances.

This PR does not constitute an API change. The new overloads are
identical to their `async` peers and there is no change in the
underlying macro expansion logic at compile time or runtime. The PR
serves solely to suppress new spurious warnings that were not emitted in
Swift 6.1 or earlier.

Resolves #1177.
Resolves rdar://149299786.

### Checklist:

- [x] Code and documentation should follow the style of the [Style
Guide](https://github.com/apple/swift-testing/blob/main/Documentation/StyleGuide.md).
- [x] If public symbols are renamed or modified, DocC references should
be updated.
grynspan added a commit that referenced this pull request Jun 26, 2025
- **Explanation**: Suppress some new/spurious warnings from the compiler
in Swift 6.2 when using `#expect(throws:)` with a synchronous closure
that calls a `noasync` function.
- **Scope**: Testing errors thrown from synchronous code.
- **Issues**: #1177, rdar://149299786
- **Original PRs**: #1178
- **Risk**: No obvious risk.
- **Testing**: Existing test functions show the issue and that it's been
resolved.
- **Reviewers**: @stmontgomery @briancroom
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug 🪲 Something isn't working concurrency 🔀 Swift concurrency/sendability issues macros 🔭 Related to Swift macros such as @Test or #expect workaround Workaround for an issue in another component (may need to revert later)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Spurious warnings about noasync calls in #expect(throws:)

3 participants