Skip to content

Commit b5066bb

Browse files
committed
Sema: Check the availability of property wrappers attached to VarDecls in named patterns.
The availability of property wrappers was previously checked for typed patterns but not named patterns. Resolves rdar://86698223.
1 parent ae9f355 commit b5066bb

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

lib/Sema/TypeCheckAccess.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,6 +1683,11 @@ class DeclAvailabilityChecker : public DeclVisitor<DeclAvailabilityChecker> {
16831683
return;
16841684

16851685
checkType(theVar->getValueInterfaceType(), /*typeRepr*/nullptr, theVar);
1686+
1687+
for (auto attr : theVar->getAttachedPropertyWrappers()) {
1688+
checkType(attr->getType(), attr->getTypeRepr(), theVar,
1689+
ExportabilityReason::PropertyWrapper);
1690+
}
16861691
}
16871692

16881693
/// \see visitPatternBindingDecl
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// RUN: %target-typecheck-verify-swift -target %target-cpu-apple-macosx10.50
2+
3+
// REQUIRES: OS=macosx
4+
5+
struct S {}
6+
7+
@propertyWrapper
8+
struct AlwaysAvailableWrapper<T> {
9+
var wrappedValue: T
10+
}
11+
12+
@available(macOS 10.51, *)
13+
@propertyWrapper
14+
struct Available10_51Wrapper<T> {
15+
var wrappedValue: T
16+
}
17+
18+
@available(*, unavailable)
19+
@propertyWrapper
20+
struct UnavailableWrapper<T> { // expected-note 6 {{'UnavailableWrapper' has been explicitly marked unavailable here}}
21+
var wrappedValue: T
22+
}
23+
24+
25+
struct AlwaysAvailableStruct { // expected-note 2 {{add @available attribute to enclosing struct}}
26+
@AlwaysAvailableWrapper var alwaysAvailableExplicit: S
27+
@AlwaysAvailableWrapper var alwaysAvailableInferred = S()
28+
29+
@Available10_51Wrapper var available10_51Explicit: S // expected-error {{'Available10_51Wrapper' is only available in macOS 10.51 or newer}}
30+
@Available10_51Wrapper var available10_51Inferred = S() // expected-error {{'Available10_51Wrapper' is only available in macOS 10.51 or newer}}
31+
32+
@UnavailableWrapper var unavailableExplicit: S // expected-error {{'UnavailableWrapper' is unavailable}}
33+
@UnavailableWrapper var unavailableInferred = S() // expected-error {{'UnavailableWrapper' is unavailable}}
34+
}
35+
36+
@available(macOS 10.51, *)
37+
struct Available10_51Struct {
38+
@AlwaysAvailableWrapper var alwaysAvailableExplicit: S
39+
@AlwaysAvailableWrapper var alwaysAvailableInferred = S()
40+
41+
@Available10_51Wrapper var available10_51Explicit: S
42+
@Available10_51Wrapper var available10_51Inferred = S()
43+
44+
@UnavailableWrapper var unavailableExplicit: S // expected-error {{'UnavailableWrapper' is unavailable}}
45+
@UnavailableWrapper var unavailableInferred = S() // expected-error {{'UnavailableWrapper' is unavailable}}
46+
}
47+
48+
@available(*, unavailable)
49+
struct UnavailableStruct {
50+
@AlwaysAvailableWrapper var alwaysAvailableExplicit: S
51+
@AlwaysAvailableWrapper var alwaysAvailableInferred = S()
52+
53+
@Available10_51Wrapper var available10_51Explicit: S // expected-error {{'Available10_51Wrapper' is only available in macOS 10.51 or newer}}
54+
@Available10_51Wrapper var available10_51Inferred = S() // expected-error {{'Available10_51Wrapper' is only available in macOS 10.51 or newer}}
55+
56+
@UnavailableWrapper var unavailableExplicit: S
57+
@UnavailableWrapper var unavailableInferred = S()
58+
}
59+
60+
func alwaysAvailableFunc( // expected-note {{add @available attribute to enclosing global function}}
61+
@AlwaysAvailableWrapper _ alwaysAvailable: S,
62+
@Available10_51Wrapper _ available10_51: S, // expected-error {{'Available10_51Wrapper' is only available in macOS 10.51 or newer}}
63+
@UnavailableWrapper _ unavailable: S // expected-error {{'UnavailableWrapper' is unavailable}}
64+
) {}
65+
66+
@available(macOS 10.51, *)
67+
func available10_51Func(
68+
@AlwaysAvailableWrapper _ alwaysAvailable: S,
69+
@Available10_51Wrapper _ available10_51: S,
70+
@UnavailableWrapper _ unavailable: S // expected-error {{'UnavailableWrapper' is unavailable}}
71+
) {}
72+
73+
@available(*, unavailable)
74+
func unavailableFunc(
75+
@AlwaysAvailableWrapper _ alwaysAvailable: S,
76+
@Available10_51Wrapper _ available10_51: S,
77+
@UnavailableWrapper _ unavailable: S
78+
) {}

validation-test/Sema/SwiftUI/radar88971160.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import SwiftUI
77
@MainActor
88
class ContentState: ObservableObject { }
99

10+
@available(SwiftStdlib 5.3, *)
1011
struct SomeView: View {
1112
@StateObject private var contentState = ContentState()
1213

validation-test/Sema/SwiftUI/rdar74447308.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ItemList: ObservableObject {
1414
@Published var items = [Item]()
1515
}
1616

17+
@available(SwiftStdlib 5.3, *)
1718
struct ContentView: View {
1819
@StateObject var list = ItemList()
1920

0 commit comments

Comments
 (0)