Skip to content

Commit 8567630

Browse files
committed
Sema: Test @_implementationOnly classes
1 parent 5bffd70 commit 8567630

File tree

1 file changed

+85
-1
lines changed

1 file changed

+85
-1
lines changed

test/Sema/hidden-memory-layout.swift

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ private struct HiddenLayout {
7676
// expected-opt-in-note @-1 2 {{struct 'HiddenLayout' is not '@usableFromInline' or public}}
7777
// expected-opt-in-note @-2 1 {{initializer 'init()' is not '@usableFromInline' or public}}
7878
// expected-opt-in-note @-3 2 {{struct declared here}}
79-
// expected-opt-in-note @-4 {{struct declared here}}
79+
// expected-opt-in-note @-4 4 {{struct declared here}}
8080
}
8181
#else
8282
private struct HiddenLayout {
@@ -222,3 +222,87 @@ private struct HiddenLayoutUser {
222222
@_implementationOnly // expected-opt-in-error {{'@_implementationOnly' may not be used on public declarations}}
223223
public struct PublicHiddenStruct {}
224224
#endif
225+
226+
/// Classes use sites
227+
228+
public class PublicClass {
229+
public init() { fatalError() }
230+
231+
public var publicField: StructFromDirect
232+
// expected-error @-1 {{cannot use struct 'StructFromDirect' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'directs' has been imported as implementation-only}}
233+
234+
private var privateField: StructFromDirect
235+
// expected-opt-in-error @-1 {{cannot use struct 'StructFromDirect' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'directs' has been imported as implementation-only}}
236+
private var a: ExposedLayoutPublic
237+
private var aa: ExposedLayoutInternal
238+
private var b: ExposedLayoutPrivate
239+
private var c: HiddenLayout
240+
// expected-opt-in-error @-1 {{cannot use struct 'HiddenLayout' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'HiddenLayout' is marked '@_implementationOnly'}}
241+
242+
private var d: ExposedEnumPublic
243+
private var e: ExposedEnumPrivate
244+
245+
@_neverEmitIntoClient
246+
private func privateFunc(h: HiddenLayout) {}
247+
}
248+
249+
internal class InternalClass {
250+
public init() { fatalError() }
251+
252+
public var publicField: StructFromDirect
253+
// expected-opt-in-error @-1 {{cannot use struct 'StructFromDirect' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'directs' has been imported as implementation-only}}
254+
private var privateField: StructFromDirect
255+
// expected-opt-in-error @-1 {{cannot use struct 'StructFromDirect' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'directs' has been imported as implementation-only}}
256+
257+
private var a: ExposedLayoutPublic
258+
private var aa: ExposedLayoutInternal
259+
private var b: ExposedLayoutPrivate
260+
private var c: HiddenLayout
261+
// expected-opt-in-error @-1 {{cannot use struct 'HiddenLayout' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'HiddenLayout' is marked '@_implementationOnly'}}
262+
263+
private var d: ExposedEnumPublic
264+
private var e: ExposedEnumPrivate
265+
266+
private func privateFunc(h: HiddenLayout) {} // expected-embedded-opt-in-error {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@_neverEmitIntoClient' because 'HiddenLayout' is marked '@_implementationOnly'}}
267+
}
268+
269+
private class PrivateClass {
270+
public init() { fatalError() }
271+
272+
public var publicField: StructFromDirect
273+
// expected-opt-in-error @-1 {{cannot use struct 'StructFromDirect' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'directs' has been imported as implementation-only}}
274+
private var privateField: StructFromDirect
275+
// expected-opt-in-error @-1 {{cannot use struct 'StructFromDirect' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'directs' has been imported as implementation-only}}
276+
277+
private var a: ExposedLayoutPublic
278+
private var aa: ExposedLayoutInternal
279+
private var b: ExposedLayoutPrivate
280+
private var c: HiddenLayout
281+
// expected-opt-in-error @-1 {{cannot use struct 'HiddenLayout' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'HiddenLayout' is marked '@_implementationOnly'}}
282+
283+
private var d: ExposedEnumPublic
284+
private var e: ExposedEnumPrivate
285+
286+
private func privateFunc(h: HiddenLayout) {} // expected-embedded-opt-in-error {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@_neverEmitIntoClient' because 'HiddenLayout' is marked '@_implementationOnly'}}
287+
}
288+
289+
#if UseImplementationOnly
290+
@_implementationOnly
291+
internal class HiddenClass {
292+
public init() { fatalError() }
293+
294+
public var publicField: StructFromDirect
295+
private var privateField: StructFromDirect
296+
297+
private var a: ExposedLayoutPublic
298+
private var aa: ExposedLayoutInternal
299+
private var b: ExposedLayoutPrivate
300+
private var c: HiddenLayout
301+
302+
private var d: ExposedEnumPublic
303+
private var e: ExposedEnumPrivate
304+
}
305+
306+
@_implementationOnly // expected-opt-in-error {{'@_implementationOnly' may not be used on public declarations}}
307+
public enum PublicHiddenClass {}
308+
#endif

0 commit comments

Comments
 (0)