Skip to content

Add (hidden) synchronous overloads of #expect(throws:). #1178

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 26, 2025

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:)
2 participants