Skip to content

AST: Emit correct synthesized availability attributes for unownedExecutor property #64015

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 3 commits into from
Mar 3, 2023

Conversation

tshortli
Copy link
Contributor

@tshortli tshortli commented Mar 2, 2023

When synthesizing a declaration and inferring its availability, the synthesized attribute should factor in unavailability of the parent declarations. This recently regressed with #63361. However, the previous implementation did not produce correct results, either, because the logic for merging availability attributes produced a non-sensical result when both unavailable and introduced: availability attributes were merged. For example, this was the result for the synthesized unownedExecutor property of an actor when the actor was marked unavailable:

@available(macOS, unavailable)
actor A {
  // Incorrectly synthesized availability for `unownedExecutor` which results from merging
  // the unavailability of the parent and the availability of the UnownedSerialExecutor type.
  @available(macOS, unavailable, introduced: macOS 10.15)
  @_semantics("defaultActor") nonisolated final var unownedExecutor: UnownedSerialExecutor { get }
}

This is fixed by omitting all version components from the synthesized attribute when the overall attribute kind is "unavailable".

Additionally, I discovered that the concurrency_availability.swift test case was no longer testing what it intended to test. The conformances to Actor for each actor in the test were no longer being synthesized and therefore unownedExecutor was not being synthesized. That was fixed by importing the _Concurrency module directly, which seems to be necessary because of the -parse-stdlib flag in the test.

Finally, this PR also introduces new lit substitutions that allow tests to specify that they want a deployment target corresponding a particular Swift release (e.g. Swift 5.3).

Resolves rdar://106055566

tshortli added 3 commits March 2, 2023 10:09
…o Swift releases.

For example, tests can now invoke the frontend passing `-target %target-swift-abi-5.3-triple` to compile with a deployment target coresponding to the Swift 5.3 release on the test `run_os`.
…cutor` property.

When synthesizing a declaration and inferring its availability, the synthesized attribute should factor in unavailability of the parent declarations. This recently regressed with swiftlang#63361. However, the previous implementation did not produce correct results, either, because the logic for merging availability attributes produced a non-sensical result when both `unavailable` and `introduced:` availability attributes were merged. For example, this was the result for the synthesized `unownedExecutor` property of an actor when the actor was marked unavailable:

```
@available(macOS, unavailable)
actor A {
  // Incorrectly synthesized availability for `unownedExecutor` which results from merging
  // the unavailability of the parent and the availability of the UnownedSerialExecutor type.
  @available(macOS, unavailable, introduced: macOS 10.15)
  @_semantics("defaultActor") nonisolated final var unownedExecutor: UnownedSerialExecutor { get }
}
```

This is fixed by omitting all version components from the synthesized attribute when the overall attribute kind is "unavailable".

Additionally, I discovered that the `concurrency_availability.swift` test case was no longer testing what it intended to test. The conformances to `Actor` for each `actor` in the test were no longer being synthesized and therefore `unownedExecutor` was not being synthesized. That was fixed by importing the `_Concurrency` module directly, which seems to be necessary because of the `-parse-stdlib` flag in the test.

Resolves rdar://106055566
@tshortli tshortli force-pushed the unavailable-actor branch from d82153b to 9c76e0d Compare March 2, 2023 18:09
@tshortli
Copy link
Contributor Author

tshortli commented Mar 2, 2023

@swift-ci please test

@tshortli tshortli merged commit 5d68053 into swiftlang:main Mar 3, 2023
@tshortli tshortli deleted the unavailable-actor branch March 3, 2023 01:48
tshortli added a commit to tshortli/swift that referenced this pull request Mar 21, 2023
…tainer.

It turns out that we must allow declarations with `introduced:` availability
nested inside of other declarations that are `unavailable` in order to
influence weak linking. Stop diagnosing declarations as being more available
than their unavailable containers and revert some changes to availability
inference that were designed to avoid creating these nestings but caused
regressions for declarations marked `@_spi_available.`

Reverts parts of swiftlang#64310,
swiftlang#64015, and
swiftlang#62900.
etcwilde pushed a commit to etcwilde/swift that referenced this pull request Apr 19, 2023
…tainer.

It turns out that we must allow declarations with `introduced:` availability
nested inside of other declarations that are `unavailable` in order to
influence weak linking. Stop diagnosing declarations as being more available
than their unavailable containers and revert some changes to availability
inference that were designed to avoid creating these nestings but caused
regressions for declarations marked `@_spi_available.`

Reverts parts of swiftlang#64310,
swiftlang#64015, and
swiftlang#62900.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants