Skip to content

Conversation

@grynspan
Copy link
Contributor

@grynspan grynspan commented Nov 3, 2025

This works around rdar://122011759 which appears to have been exacerbated by swiftlang/swift#84907.

For example:

let file = try #require(fmemopen(nil, 1, "wb+"))

The third parameter of fmemopen() is of type const char * (AKA UnsafePointer<CChar>) and we're passing the string literal "wb+" which is implicitly cast to a C string by the compiler. However, overload resolution of the expansion function used by #require() is now preferring an overload that uses variadic generics, and that overload is impacted by a compiler issue (rdar://122011759) that causes it to pass a garbage pointer as the temporary C string. Previously, the type checker would pick an overload with a concrete, finite set of generic arguments (<T, Arg0, Arg1, Arg2, R> instead of <T, each U, R>.)

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 works around rdar://122011759 which appears to have been exacerbated by
swiftlang/swift#84907.
@grynspan grynspan added this to the Swift 6.x (main) milestone Nov 3, 2025
@grynspan grynspan self-assigned this Nov 3, 2025
@grynspan grynspan added workaround Workaround for an issue in another component (may need to revert later) issue-handling Related to Issue handling within the testing library macros 🔭 Related to Swift macros such as @Test or #expect labels Nov 3, 2025
@grynspan grynspan merged commit ec463f9 into main Nov 3, 2025
27 checks passed
@grynspan grynspan deleted the jgrynspan/disfavor-variadic-generics branch November 3, 2025 20:49
grynspan added a commit that referenced this pull request Nov 7, 2025
…#1389)

This works around rdar://122011759 which appears to have been
exacerbated by swiftlang/swift#84907.

For example:

```swift
let file = try #require(fmemopen(nil, 1, "wb+"))
```

The third parameter of `fmemopen()` is of type `const char *` (AKA
`UnsafePointer<CChar>`) and we're passing the string literal `"wb+"`
which is implicitly cast to a C string by the compiler. However,
overload resolution of the expansion function used by `#require()` is
now preferring an overload that uses variadic generics, and that
overload is impacted by a compiler issue (rdar://122011759) that causes
it to pass a garbage pointer as the temporary C string. Previously, the
type checker would pick an overload with a concrete, finite set of
generic arguments (`<T, Arg0, Arg1, Arg2, R>` instead of `<T, each U,
R>`.)

### 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

issue-handling Related to Issue handling within the testing library 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.

3 participants