Files
swift-mirror/test/Interop/Cxx/class/memberwise-initializer-module-interface.swift
Egor Zhdan 6943986c71 [cxx-interop] Import private fields of C++ structs
While private and protected fields coming from C++ cannot be accessed from Swift, they can affect Swift typechecking.

For instance, the Swift typechecker mechanism that adds implicit `Sendable` conformances works by iterating over all of the struct's fields and checking whether all of them are `Sendable`. This logic was broken for C++ types with private fields, since they were never accounted for. This resulted in erroneous implicit `Sendable` confromances being added.

Same applies for `BitwiseCopyable`.

In addition to this, ClangImporter used to mistakenly mark all C++ structs that have private fields as types with unreferenceable storage, which hampered optimizations.

As a side effect of this change, we now also provide a better diagnostic when someone tries to access a private C++ field from Swift.

rdar://134430857
2024-11-12 12:47:26 +00:00

55 lines
1.8 KiB
Swift

// RUN: %target-swift-ide-test -print-module -module-to-print=MemberwiseInitializer -access-filter-public -I %S/Inputs -source-filename=x -enable-experimental-cxx-interop | %FileCheck %s
// CHECK: struct StructPrivateOnly {
// CHECK-NEXT: init()
// CHECK-NEXT: }
// CHECK-NEXT: struct StructPublicOnly {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct StructEmptyPrivateSection {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct StructPublicAndPrivate {
// CHECK-NEXT: init()
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct StructWithUnimportedMemberFunction {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassPrivateOnly {
// CHECK-NEXT: init()
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassPublicOnly {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassEmptyPublicSection {
// CHECK-NEXT: init()
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassPrivateAndPublic {
// CHECK-NEXT: init()
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassWithUnimportedMemberFunction {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassWithTemplatedFunction {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }
// CHECK-NEXT: struct ClassWithTemplatedUsingDecl {
// CHECK-NEXT: init()
// CHECK-NEXT: init(varPublic: Int32)
// CHECK-NEXT: var varPublic: Int32
// CHECK-NEXT: }