Skip to content

Sema: Do not diagnose set accessor availability for InOutExprs inside of LoadExprs #72369

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

Conversation

tshortli
Copy link
Contributor

@tshortli tshortli commented Mar 16, 2024

The recent deprecation of the set accessor for CommandLine.arguments exposed a bug in availability checking:

 for arg in CommandLine.arguments[1...] {
                      ╰─ warning: setter for 'arguments' is deprecated: ...

The parser generates an InOutExpr in the AST for the subscript access in the code above and the availabilty checker was unconditionally diagnosing set accessors for InOutExprs, resulting in spurious availability warnings for read-only accesses of properties. The fix is to check whether there is an enclosing LoadExpr in the AST and only diagnose the getter accessor in that case.

Includes drive-by fixes for a couple warnings.

Resolves rdar://124566405

@tshortli tshortli force-pushed the spurious-unavailable-setter-diagnostic branch from 65eb40f to c1d29b2 Compare March 18, 2024 05:09
@tshortli
Copy link
Contributor Author

@swift-ci please smoke test

This test documents the current behavior of availability diagnostics for
generalized accessors, including some bugs which have been called out as
FIXMEs.
…de of `LoadExpr`s.

The recent deprecation of the set accessor for `CommandLine.arguments` exposed
a bug in availability checking:

```
 for arg in CommandLine.arguments[1...] {
                      ╰─ warning: setter for 'arguments' is deprecated: ...
```

The parser generates an `InOutExpr` in the AST for the subscript access in the
code above and the availabilty checker was unconditionally diagnosing set
accessors for `InOutExprs`, resulting in spurious availability warnings for
read-only accesses of properties. The fix is to check whether there is an
enclosing `LoadExpr` in the AST and only diagnose the getter accessor in that
case.

Resolves rdar://124566405
@tshortli tshortli force-pushed the spurious-unavailable-setter-diagnostic branch from c1d29b2 to 5a23239 Compare March 18, 2024 23:18
@tshortli
Copy link
Contributor Author

@swift-ci please smoke test

@tshortli tshortli enabled auto-merge March 19, 2024 01:40
@tshortli tshortli merged commit 6cd49ef into swiftlang:main Mar 19, 2024
@tshortli tshortli deleted the spurious-unavailable-setter-diagnostic branch March 19, 2024 03:58
tshortli added a commit to tshortli/swift that referenced this pull request Jun 25, 2024
This fixes a regression from swiftlang#72369.
The compiler now incorrectly diagnoses use of an unavailable setter in this
example:

```
func increaseBrightness(in window: UIWindow) {
  // warning: setter for 'screen' was deprecated in iOS 13.0
  window.screen.brightness = 1.0
}
```

While the setter is deprecated, it would not going to be called in the generated
code since `screen` is a reference type and there is no writeback through
the setter for `screen` after setting `brightness`.

Resolves rdar://129679658
tshortli added a commit to tshortli/swift that referenced this pull request Jun 25, 2024
This fixes a regression from swiftlang#72369.
The compiler now incorrectly diagnoses use of an unavailable setter in this
example:

```
func increaseBrightness(in window: UIWindow) {
  // warning: setter for 'screen' was deprecated in iOS 13.0
  window.screen.brightness = 1.0
}
```

While the setter is deprecated, it would not be called in the generated code
since `screen` is a reference type and there is no writeback through the setter
for `screen` after setting `brightness`.

Resolves rdar://129679658
tshortli added a commit to tshortli/swift that referenced this pull request Jun 27, 2024
This fixes a regression from swiftlang#72369.
The compiler now incorrectly diagnoses use of an unavailable setter in this
example:

```
func increaseBrightness(in window: UIWindow) {
  // warning: setter for 'screen' was deprecated in iOS 13.0
  window.screen.brightness = 1.0
}
```

While the setter is deprecated, it would not be called in the generated code
since `screen` is a reference type and there is no writeback through the setter
for `screen` after setting `brightness`.

Resolves rdar://129679658
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.

4 participants