Skip to content

Commit fa50221

Browse files
committed
Sema: Use VarDecl::isLayoutExposedToClients() when checking VarDecl exportability
1 parent 01bc774 commit fa50221

File tree

4 files changed

+23
-24
lines changed

4 files changed

+23
-24
lines changed

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,10 @@ bool swift::isExported(const ValueDecl *VD) {
6767
if (accessScope.isPublic())
6868
return true;
6969

70-
// Is this a stored property in a non-resilient struct or class?
71-
auto *property = dyn_cast<VarDecl>(VD);
72-
if (!property || !property->hasStorage() || property->isStatic())
73-
return false;
74-
auto *parentNominal = dyn_cast<NominalTypeDecl>(property->getDeclContext());
75-
if (!parentNominal || parentNominal->isResilient())
76-
return false;
77-
78-
// Is that struct or class part of the module's API or ABI?
79-
AccessScope parentAccessScope = parentNominal->getFormalAccessScope(
80-
nullptr, /*treatUsableFromInlineAsPublic*/true);
81-
if (parentAccessScope.isPublic())
82-
return true;
70+
// Is this a stored property in a @frozen struct or class?
71+
if (auto *property = dyn_cast<VarDecl>(VD))
72+
if (property->isLayoutExposedToClients())
73+
return true;
8374

8475
return false;
8576
}

test/SPI/spi_members.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public struct Wrapper<T> {
99

1010
@_spi(Foo)
1111
public class Bar {
12-
// expected-note@-1 12{{type declared here}}
12+
// expected-note@-1 16{{type declared here}}
1313

1414
public init() {}
1515
}
@@ -104,17 +104,19 @@ public struct Resilient {
104104

105105
private var computedProperty: Bar { Bar() }
106106

107-
private lazy var lazyProperty1 = Bar()
107+
private lazy var lazyProperty1 = Bar() // expected-error {{cannot use class 'Bar' here; it is SPI}}
108108
// expected-error@-1 {{initializer 'init()' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
109109
// expected-error@-2 {{class 'Bar' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
110110

111-
private lazy var lazyProperty2: Bar = Bar()
111+
private lazy var lazyProperty2: Bar = Bar() // expected-error {{cannot use class 'Bar' here; it is SPI}}
112112
// expected-error@-1 {{initializer 'init()' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
113113
// expected-error@-2 {{class 'Bar' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
114114

115115
@Wrapper private var wrappedProperty1: Bar
116+
// expected-error@-1 {{cannot use class 'Bar' here; it is SPI}}
116117

117118
@Wrapper private var wrappedProperty2 = Bar()
118-
// expected-error@-1 {{class 'Bar' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
119-
// expected-error@-2 {{initializer 'init()' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
119+
// expected-error@-1 {{cannot use class 'Bar' here; it is SPI}}
120+
// expected-error@-2 {{class 'Bar' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
121+
// expected-error@-3 {{initializer 'init()' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
120122
}

test/Sema/implementation-only-import-in-decls.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,33 +135,36 @@ precedencegroup TestHigherThan {
135135
higherThan: BadPrecedence // expected-error {{cannot use precedence group 'BadPrecedence' here; 'BADLibrary' has been imported as implementation-only}}
136136
}
137137

138-
public struct PublicStructStoredProperties {
138+
@frozen public struct PublicStructStoredProperties {
139139
public var publiclyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
140140
internal var internallyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
141141
private var privatelyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
142142
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
143+
// expected-error@-1 {{struct 'BadStruct' cannot be used in a property initializer in a '@frozen' type because 'BADLibrary' was imported implementation-only}}
143144

144145
private var computedIsOkay: BadStruct? { return nil } // okay
145146
private static var staticIsOkay: BadStruct? // okay
146147
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
147148
}
148149

149-
@usableFromInline internal struct UFIStructStoredProperties {
150+
@frozen @usableFromInline internal struct UFIStructStoredProperties {
150151
@usableFromInline var publiclyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
151152
internal var internallyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
152153
private var privatelyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
153154
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
155+
// expected-error@-1 {{struct 'BadStruct' cannot be used in a property initializer in a '@frozen' type because 'BADLibrary' was imported implementation-only}}
154156

155157
private var computedIsOkay: BadStruct? { return nil } // okay
156158
private static var staticIsOkay: BadStruct? // okay
157159
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
158160
}
159161

160-
public class PublicClassStoredProperties {
162+
@_fixed_layout public class PublicClassStoredProperties {
161163
public var publiclyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
162164
internal var internallyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
163165
private var privatelyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
164166
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use struct 'BadStruct' here; 'BADLibrary' has been imported as implementation-only}}
167+
// expected-error@-1 {{struct 'BadStruct' cannot be used in a property initializer in a '@frozen' type because 'BADLibrary' was imported implementation-only}}
165168

166169
private var computedIsOkay: BadStruct? { return nil } // okay
167170
private static var staticIsOkay: BadStruct? // okay

test/Sema/spi-in-decls.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,33 +169,36 @@ extension Array: TestConstrainedExtensionProto where Element == BadStruct { // e
169169
// higherThan: BadPrecedence
170170
//}
171171

172-
public struct PublicStructStoredProperties {
172+
@frozen public struct PublicStructStoredProperties {
173173
public var publiclyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
174174
internal var internallyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
175175
private var privatelyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
176176
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
177+
// expected-error@-1 {{struct 'BadStruct' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
177178

178179
private var computedIsOkay: BadStruct? { return nil } // okay
179180
private static var staticIsOkay: BadStruct? // okay
180181
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
181182
}
182183

183-
@usableFromInline internal struct UFIStructStoredProperties {
184+
@frozen @usableFromInline internal struct UFIStructStoredProperties {
184185
@usableFromInline var publiclyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
185186
internal var internallyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
186187
private var privatelyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
187188
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
189+
// expected-error@-1 {{struct 'BadStruct' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
188190

189191
private var computedIsOkay: BadStruct? { return nil } // okay
190192
private static var staticIsOkay: BadStruct? // okay
191193
@usableFromInline internal var computedUFIIsNot: BadStruct? { return nil } // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
192194
}
193195

194-
public class PublicClassStoredProperties {
196+
@_fixed_layout public class PublicClassStoredProperties {
195197
public var publiclyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
196198
internal var internallyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
197199
private var privatelyBad: BadStruct? // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
198200
private let letIsLikeVar = [BadStruct]() // expected-error {{cannot use struct 'BadStruct' here; it is SPI}}
201+
// expected-error@-1 {{struct 'BadStruct' cannot be used in a property initializer in a '@frozen' type because it is SPI}}
199202

200203
private var computedIsOkay: BadStruct? { return nil } // okay
201204
private static var staticIsOkay: BadStruct? // okay

0 commit comments

Comments
 (0)