Skip to content

Commit afe335d

Browse files
committed
Sema: Add more tests for class exportability checking in NLE
1 parent 8eb530c commit afe335d

File tree

1 file changed

+122
-4
lines changed

1 file changed

+122
-4
lines changed

test/Sema/hidden-memory-layout.swift

Lines changed: 122 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,36 @@ private struct ExposedLayoutPrivate {
7272
init() { fatalError() } // expected-note {{initializer 'init()' is not '@usableFromInline' or public}}
7373
}
7474

75+
public class ExposedClassPublic {
76+
public init() { fatalError() }
77+
}
78+
79+
internal class ExposedClassInternal {
80+
// expected-note @-1 {{type declared here}}
81+
}
82+
83+
private class ExposedClassPrivate {
84+
// expected-note @-1 2 {{class 'ExposedClassPrivate' is not '@usableFromInline' or public}}
85+
// expected-note @-2 2 {{type declared here}}
86+
init() { fatalError() } // expected-note {{initializer 'init()' is not '@usableFromInline' or public}}
87+
}
88+
89+
#if UseImplementationOnly
90+
@_implementationOnly
91+
private class HiddenClass {
92+
// expected-opt-in-note @-1 2 {{class 'HiddenClass' is not '@usableFromInline' or public}}
93+
// expected-opt-in-note @-2 1 {{initializer 'init()' is not '@usableFromInline' or public}}
94+
// expected-opt-in-note @-3 6 {{class declared here}}
95+
// expected-opt-in-note @-4 2 {{type declared here}}
96+
}
97+
#else
98+
private class HiddenClass {
99+
// expected-not-opt-in-note @-1 2 {{class 'HiddenClass' is not '@usableFromInline' or public}}
100+
// expected-not-opt-in-note @-2 1 {{initializer 'init()' is not '@usableFromInline' or public}}
101+
// expected-not-opt-in-note @-3 2 {{type declared here}}
102+
}
103+
#endif
104+
75105
#if UseImplementationOnly
76106
@_implementationOnly
77107
private struct HiddenLayout {
@@ -158,6 +188,15 @@ public func explicitlyInlinable() {
158188
// expected-error @-1 2 {{struct 'HiddenLayout' is private and cannot be referenced from an '@inlinable' function}}
159189
// expected-error @-2 {{initializer 'init()' is private and cannot be referenced from an '@inlinable' function}}
160190

191+
let _: ExposedClassPublic = ExposedClassPublic()
192+
let _: ExposedClassPrivate = ExposedClassPrivate()
193+
// expected-error @-1 2 {{class 'ExposedClassPrivate' is private and cannot be referenced from an '@inlinable' function}}
194+
// expected-error @-2 {{initializer 'init()' is private and cannot be referenced from an '@inlinable' function}}
195+
196+
let _: HiddenClass = HiddenClass()
197+
// expected-error @-1 2 {{class 'HiddenClass' is private and cannot be referenced from an '@inlinable' function}}
198+
// expected-error @-2 {{initializer 'init()' is private and cannot be referenced from an '@inlinable' function}}
199+
161200
let _: ExposedEnumPublic = ExposedEnumPublic.A
162201
let _: ExposedEnumPrivate = ExposedEnumPrivate.A
163202
// expected-error @-1 2 {{enum 'ExposedEnumPrivate' is private and cannot be referenced from an '@inlinable' function}}
@@ -181,6 +220,11 @@ public func implicitlyInlinablePublic() {
181220
let _: HiddenLayout = HiddenLayout()
182221
// expected-embedded-opt-in-error @-1 2 {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenLayout' is marked '@_implementationOnly'}}
183222

223+
let _: ExposedClassPublic = ExposedClassPublic()
224+
let _: ExposedClassPrivate = ExposedClassPrivate()
225+
let _: HiddenClass = HiddenClass()
226+
// expected-embedded-opt-in-error @-1 2 {{class 'HiddenClass' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenClass' is marked '@_implementationOnly'}}
227+
184228
let _: ExposedEnumPublic = ExposedEnumPublic.A
185229
let _: ExposedEnumPrivate = ExposedEnumPrivate.A
186230
let _: HiddenEnum = HiddenEnum.A
@@ -199,6 +243,11 @@ private func implicitlyInlinablePrivate() {
199243
let _: HiddenLayout = HiddenLayout()
200244
// expected-embedded-opt-in-error @-1 2 {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenLayout' is marked '@_implementationOnly'}}
201245

246+
let _: ExposedClassPublic = ExposedClassPublic()
247+
let _: ExposedClassPrivate = ExposedClassPrivate()
248+
let _: HiddenClass = HiddenClass()
249+
// expected-embedded-opt-in-error @-1 2 {{class 'HiddenClass' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenClass' is marked '@_implementationOnly'}}
250+
202251
let _: ExposedEnumPublic = ExposedEnumPublic.A
203252
let _: ExposedEnumPrivate = ExposedEnumPrivate.A
204253
let _: HiddenEnum = HiddenEnum.A
@@ -216,6 +265,11 @@ public func explicitNonInliable() {
216265
let _: ExposedLayoutPublic = ExposedLayoutPublic()
217266
let _: ExposedLayoutPrivate = ExposedLayoutPrivate()
218267
let _: HiddenLayout = HiddenLayout()
268+
269+
let _: ExposedClassPublic = ExposedClassPublic()
270+
let _: ExposedClassPrivate = ExposedClassPrivate()
271+
let _: HiddenClass = HiddenClass()
272+
219273
let _: ExposedEnumPublic = ExposedEnumPublic.A
220274
let _: ExposedEnumPrivate = ExposedEnumPrivate.A
221275
let _: HiddenEnum = HiddenEnum.A
@@ -231,6 +285,11 @@ internal func explicitNonInliableInternal() {
231285
let _: ExposedLayoutPublic = ExposedLayoutPublic()
232286
let _: ExposedLayoutPrivate = ExposedLayoutPrivate()
233287
let _: HiddenLayout = HiddenLayout()
288+
289+
let _: ExposedClassPublic = ExposedClassPublic()
290+
let _: ExposedClassPrivate = ExposedClassPrivate()
291+
let _: HiddenClass = HiddenClass()
292+
234293
let _: ExposedEnumPublic = ExposedEnumPublic.A
235294
let _: ExposedEnumPrivate = ExposedEnumPrivate.A
236295
let _: HiddenEnum = HiddenEnum.A
@@ -258,6 +317,12 @@ public struct ExposedLayoutPublicUser: ProtocolFromDirect {
258317
private var c: HiddenLayout
259318
// 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'}}
260319

320+
private var ca: ExposedClassPublic
321+
private var cb: ExposedClassInternal
322+
private var cc: ExposedClassPrivate
323+
private var cd: HiddenClass
324+
// expected-opt-in-error @-1 {{cannot use class 'HiddenClass' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'HiddenClass' is marked '@_implementationOnly'}}
325+
261326
private var d: ExposedEnumPublic
262327
private var e: ExposedEnumPrivate
263328
private var f: HiddenEnum
@@ -274,6 +339,8 @@ public struct ExposedLayoutPublicUser: ProtocolFromDirect {
274339

275340
private func privateFunc(h: HiddenLayout) {}
276341
// expected-embedded-opt-in-error @-1 {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenLayout' is marked '@_implementationOnly'}}
342+
private func privateFuncClass(h: HiddenClass) {}
343+
// expected-embedded-opt-in-error @-1 {{class 'HiddenClass' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenClass' is marked '@_implementationOnly'}}
277344
}
278345

279346
internal struct ExposedLayoutInternalUser: ProtocolFromDirect {
@@ -288,6 +355,12 @@ internal struct ExposedLayoutInternalUser: ProtocolFromDirect {
288355
private var c: HiddenLayout
289356
// 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'}}
290357

358+
private var ca: ExposedClassPublic
359+
private var cb: ExposedClassInternal
360+
private var cc: ExposedClassPrivate
361+
private var cd: HiddenClass
362+
// expected-opt-in-error @-1 {{cannot use class 'HiddenClass' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'HiddenClass' is marked '@_implementationOnly'}}
363+
291364
private var d: ExposedEnumPublic
292365
private var e: ExposedEnumPrivate
293366
private var f: HiddenEnum
@@ -301,6 +374,8 @@ internal struct ExposedLayoutInternalUser: ProtocolFromDirect {
301374

302375
private func privateFunc(h: HiddenLayout) {}
303376
// expected-embedded-opt-in-error @-1 {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenLayout' is marked '@_implementationOnly'}}
377+
private func privateFuncClass(h: HiddenClass) {}
378+
// expected-embedded-opt-in-error @-1 {{class 'HiddenClass' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenClass' is marked '@_implementationOnly'}}
304379
}
305380

306381
private struct ExposedLayoutPrivateUser: ProtocolFromDirect {
@@ -315,6 +390,12 @@ private struct ExposedLayoutPrivateUser: ProtocolFromDirect {
315390
private var c: HiddenLayout
316391
// 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'}}
317392

393+
private var ca: ExposedClassPublic
394+
private var cb: ExposedClassInternal
395+
private var cc: ExposedClassPrivate
396+
private var cd: HiddenClass
397+
// expected-opt-in-error @-1 {{cannot use class 'HiddenClass' in a property declaration marked public or in a '@frozen' or '@usableFromInline' context; 'HiddenClass' is marked '@_implementationOnly'}}
398+
318399
private var d: ExposedEnumPublic
319400
private var e: ExposedEnumPrivate
320401
private var f: HiddenEnum
@@ -328,6 +409,8 @@ private struct ExposedLayoutPrivateUser: ProtocolFromDirect {
328409

329410
private func privateFunc(h: HiddenLayout) {}
330411
// expected-embedded-opt-in-error @-1 {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenLayout' is marked '@_implementationOnly'}}
412+
private func privateFuncClass(h: HiddenClass) {}
413+
// expected-embedded-opt-in-error @-1 {{class 'HiddenClass' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenClass' is marked '@_implementationOnly'}}
331414
}
332415

333416
#if UseImplementationOnly
@@ -339,7 +422,13 @@ private struct HiddenLayoutUser {
339422
private var aa: ExposedLayoutInternal
340423
private var b: ExposedLayoutPrivate
341424

425+
private var ca: ExposedClassPublic
426+
private var cb: ExposedClassInternal
427+
private var cc: ExposedClassPrivate
428+
342429
private var c: HiddenLayout
430+
private var cd: HiddenClass
431+
343432
private var d: ExposedEnumPublic
344433
private var e: ExposedEnumPrivate
345434
private var f: HiddenEnum
@@ -351,6 +440,8 @@ private struct HiddenLayoutUser {
351440

352441
@export(interface)
353442
private func privateFunc(h: HiddenLayout) {}
443+
@export(interface)
444+
private func privateFuncClass(h: HiddenClass) {}
354445
}
355446

356447
@_implementationOnly // expected-opt-in-error {{'@_implementationOnly' may not be used on public declarations}}
@@ -370,6 +461,12 @@ public enum PublicEnumUser: ProtocolFromDirect {
370461
case b(HiddenLayout) // expected-error {{enum case in a public enum uses a private type}}
371462
// expected-opt-in-error @-1 {{cannot use struct 'HiddenLayout' here; 'HiddenLayout' is marked '@_implementationOnly'}}
372463

464+
case ce(ExposedClassPublic)
465+
case cc(ExposedClassInternal) // expected-error {{enum case in a public enum uses an internal type}}
466+
case cd(ExposedClassPrivate) // expected-error {{enum case in a public enum uses a private type}}
467+
case cb(HiddenClass) // expected-error {{enum case in a public enum uses a private type}}
468+
// expected-opt-in-error @-1 {{cannot use class 'HiddenClass' here; 'HiddenClass' is marked '@_implementationOnly'}}
469+
373470
case f(ExposedProtocolPublic)
374471
case g(ExposedProtocolInternal) // expected-error {{enum case in a public enum uses an internal type}}
375472
case h(ExposedProtocolPrivate) // expected-error {{enum case in a public enum uses a private type}}
@@ -387,6 +484,12 @@ internal enum InternalEnumUser: ProtocolFromDirect {
387484
case b(HiddenLayout) // expected-opt-in-error {{cannot use struct 'HiddenLayout' here; 'HiddenLayout' is marked '@_implementationOnly'}}
388485
// expected-error @-1 {{enum case in an internal enum uses a private type}}
389486

487+
case ce(ExposedClassPublic)
488+
case cc(ExposedClassInternal)
489+
case cd(ExposedClassPrivate) // expected-error {{enum case in an internal enum uses a private type}}
490+
case cb(HiddenClass) // expected-opt-in-error {{cannot use class 'HiddenClass' here; 'HiddenClass' is marked '@_implementationOnly'}}
491+
// expected-error @-1 {{enum case in an internal enum uses a private type}}
492+
390493
case f(ExposedProtocolPublic)
391494
case g(ExposedProtocolInternal)
392495
case h(ExposedProtocolPrivate) // expected-error {{enum case in an internal enum uses a private type}}
@@ -403,6 +506,11 @@ private enum PrivateEnumUser: ProtocolFromDirect {
403506
case d(ExposedLayoutPrivate)
404507
case b(HiddenLayout) // expected-opt-in-error {{cannot use struct 'HiddenLayout' here; 'HiddenLayout' is marked '@_implementationOnly'}}
405508

509+
case ce(ExposedClassPublic)
510+
case cc(ExposedClassInternal)
511+
case cd(ExposedClassPrivate)
512+
case cb(HiddenClass) // expected-opt-in-error {{cannot use class 'HiddenClass' here; 'HiddenClass' is marked '@_implementationOnly'}}
513+
406514
case f(ExposedProtocolPublic)
407515
case g(ExposedProtocolInternal)
408516
case h(ExposedProtocolPrivate)
@@ -424,6 +532,11 @@ private enum PrivateHiddenEnumUser: ProtocolFromDirect {
424532
case d(ExposedLayoutPrivate)
425533
case b(HiddenLayout)
426534

535+
case ce(ExposedClassPublic)
536+
case cc(ExposedClassInternal)
537+
case cd(ExposedClassPrivate)
538+
case cb(HiddenClass)
539+
427540
case f(ExposedProtocolPublic)
428541
case g(ExposedProtocolInternal)
429542
case h(ExposedProtocolPrivate)
@@ -443,7 +556,7 @@ internal enum InternalEnumWithRawTypeIO : RawTypeFromDirect {
443556

444557
/// Classes use sites
445558

446-
public class PublicClass: ProtocolFromDirect {
559+
public class PublicClassUser: ProtocolFromDirect {
447560
// expected-error @-1 {{cannot use protocol 'ProtocolFromDirect' in a public or '@usableFromInline' conformance; 'directs' has been imported as implementation-only}}
448561

449562
public init() { fatalError() }
@@ -474,7 +587,7 @@ public class PublicClass: ProtocolFromDirect {
474587
private func privateFunc(h: HiddenLayout) {}
475588
}
476589

477-
internal class InternalClass: ProtocolFromDirect {
590+
internal class InternalClassUser: ProtocolFromDirect {
478591
// expected-opt-in-error @-1 {{cannot use protocol 'ProtocolFromDirect' in a public or '@usableFromInline' conformance; 'directs' has been imported as implementation-only}}
479592

480593
public init() { fatalError() }
@@ -504,7 +617,7 @@ internal class InternalClass: ProtocolFromDirect {
504617
private func privateFunc(h: HiddenLayout) {} // expected-embedded-opt-in-error {{struct 'HiddenLayout' cannot be used in an embedded function not marked '@export(interface)' because 'HiddenLayout' is marked '@_implementationOnly'}}
505618
}
506619

507-
private class PrivateClass: ProtocolFromDirect {
620+
private class PrivateClassUser: ProtocolFromDirect {
508621
// expected-opt-in-error @-1 {{cannot use protocol 'ProtocolFromDirect' in a public or '@usableFromInline' conformance; 'directs' has been imported as implementation-only}}
509622

510623
public init() { fatalError() }
@@ -536,7 +649,7 @@ private class PrivateClass: ProtocolFromDirect {
536649

537650
#if UseImplementationOnly
538651
@_implementationOnly
539-
internal class HiddenClass: ProtocolFromDirect {
652+
internal class HiddenClassUser: ProtocolFromDirect {
540653
public init() { fatalError() }
541654

542655
public var publicField: StructFromDirect
@@ -547,6 +660,11 @@ internal class HiddenClass: ProtocolFromDirect {
547660
private var b: ExposedLayoutPrivate
548661
private var c: HiddenLayout
549662

663+
private var ca: ExposedClassPublic
664+
private var cb: ExposedClassInternal
665+
private var cc: ExposedClassPrivate
666+
private var cd: HiddenClass
667+
550668
private var d: ExposedEnumPublic
551669
private var e: ExposedEnumPrivate
552670
private var f: HiddenEnum

0 commit comments

Comments
 (0)