Skip to content

Commit ce680ea

Browse files
authored
[cxx-interop] Add test case that checks irgen for imported private members (#80515)
1 parent 1194b59 commit ce680ea

File tree

3 files changed

+162
-10
lines changed

3 files changed

+162
-10
lines changed

test/Interop/Cxx/class/access/Inputs/non-public.h

+30-8
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,26 @@ __attribute__((__swift_attr__("private_fileid:main/blessed.swift"))) MyClass {
2121
void publMethod(void) const {}
2222
void publMutatingMethod(void) {}
2323
int publVar;
24-
static void publStaticFunc(void);
25-
static int publStaticVar;
24+
static void publStaticFunc(void) {};
25+
static inline int publStaticVar = 0;
2626

2727
typedef int publTypedef;
28-
struct publStruct {};
28+
publTypedef publTypedefMake(void) const { return 42; }
29+
void publTypedefTake(publTypedef x) const { }
30+
31+
struct publStruct { int x; };
32+
publStruct publStructMake(void) const { return publStruct{}; }
33+
void publStructTake(publStruct x) const { }
2934

3035
enum publEnum { variantPublEnum };
31-
enum { publEnumAnonValue1 };
36+
publEnum publEnumMake(void) const { return variantPublEnum; }
37+
void publEnumTake(publEnum x) const { }
38+
3239
enum class publEnumClass { variantPublEnumClass };
40+
publEnumClass publEnumClassMake(void) const { return publEnumClass::variantPublEnumClass; }
41+
void publEnumClassTake(publEnumClass x) const { }
42+
43+
enum { publEnumAnonValue1 };
3344
enum publEnumClosed {
3445
variantPublEnumClosed
3546
} __attribute__((enum_extensibility(closed)));
@@ -42,15 +53,26 @@ __attribute__((__swift_attr__("private_fileid:main/blessed.swift"))) MyClass {
4253
void privMethod(void) const {}
4354
void privMutatingMethod(void) {}
4455
int privVar;
45-
static void privStaticFunc(void);
46-
static int privStaticVar;
56+
static void privStaticFunc(void) {};
57+
static inline int privStaticVar = 0;
4758

4859
typedef int privTypedef;
49-
struct privStruct {};
60+
privTypedef privTypedefMake(void) const { return 42; }
61+
void privTypedefTake(privTypedef x) const { }
62+
63+
struct privStruct { int x; };
64+
privStruct privStructMake(void) const { return privStruct{}; }
65+
void privStructTake(privStruct x) const { }
5066

5167
enum privEnum { variantPrivEnum };
52-
enum { privEnumAnonValue1 };
68+
privEnum privEnumMake(void) const { return variantPrivEnum; }
69+
void privEnumTake(privEnum x) const { }
70+
5371
enum class privEnumClass { variantPrivEnumClass };
72+
privEnumClass privEnumClassMake(void) const { return privEnumClass::variantPrivEnumClass; }
73+
void privEnumClassTake(privEnumClass x) const { }
74+
75+
enum { privEnumAnonValue1 };
5476
enum privEnumClosed {
5577
variantPrivEnumClosed
5678
} __attribute__((enum_extensibility(closed)));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
//--- blessed.swift
2+
// RUN: split-file %s %t
3+
// RUN: %target-swift-frontend -emit-ir -module-name main %t/blessed.swift -I %S/Inputs -cxx-interoperability-mode=default -Onone | %FileCheck %s
4+
5+
import NonPublic
6+
7+
// These extension methods are just here to make it clear what we are doing to
8+
// each Int32-typed member.
9+
extension Int32 {
10+
func read() { }
11+
mutating func write() { }
12+
}
13+
14+
extension MyClass {
15+
public func extMethod() {
16+
publMethod()
17+
privMethod()
18+
}
19+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extMethod{{.*}}"
20+
// CHECK: {{invoke|call}} void @{{.*}}publMethod{{.*}}
21+
// CHECK: {{invoke|call}} void @{{.*}}privMethod{{.*}}
22+
23+
public mutating func extMutatingMethod() {
24+
publMutatingMethod()
25+
privMutatingMethod()
26+
}
27+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extMutatingMethod{{.*}}"
28+
// CHECK: {{invoke|call}} void @{{.*}}publMutatingMethod{{.*}}
29+
// CHECK: {{invoke|call}} void @{{.*}}privMutatingMethod{{.*}}
30+
31+
public func extVarRead() {
32+
publVar.read()
33+
privVar.read()
34+
}
35+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extVarRead{{.*}}"
36+
37+
public mutating func extVarWrite() {
38+
publVar.write()
39+
privVar.write()
40+
}
41+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extVarWrite{{.*}}"
42+
43+
public func extStaticFunc() {
44+
MyClass.publStaticFunc()
45+
MyClass.privStaticFunc()
46+
}
47+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticFunc{{.*}}"
48+
// CHECK: {{invoke|call}} void @{{.*}}publStaticFunc
49+
// CHECK: {{invoke|call}} void @{{.*}}privStaticFunc
50+
51+
public func extStaticVarRead() {
52+
MyClass.publStaticVar.read()
53+
MyClass.privStaticVar.read()
54+
}
55+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticVarRead{{.*}}"
56+
57+
public func extStaticVarWrite() {
58+
MyClass.publStaticVar.write()
59+
MyClass.privStaticVar.write()
60+
}
61+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStaticVarWrite{{.*}}"
62+
63+
public func extTypedef() {
64+
let u: publTypedef = publTypedefMake()
65+
publTypedefTake(u)
66+
let i: privTypedef = privTypedefMake()
67+
privTypedefTake(i)
68+
}
69+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extTypedef{{.*}}"
70+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publTypedefMake{{.*}}
71+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publTypedefTake{{.*}}
72+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privTypedefMake{{.*}}
73+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privTypedefTake{{.*}}
74+
75+
public func extStruct() {
76+
let u: publStruct = publStructMake()
77+
publStructTake(u)
78+
let i: privStruct = privStructMake()
79+
privStructTake(i)
80+
}
81+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extStruct{{.*}}"
82+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publStructMake{{.*}}
83+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publStructTake{{.*}}
84+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privStructMake{{.*}}
85+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privStructTake{{.*}}
86+
87+
public func extEnum() {
88+
let u: publEnum = publEnumMake()
89+
publEnumTake(u)
90+
let i: privEnum = privEnumMake()
91+
privEnumTake(i)
92+
}
93+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extEnum{{.*}}"
94+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumMake{{.*}}
95+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumTake{{.*}}
96+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumMake{{.*}}
97+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumTake{{.*}}
98+
99+
// If we call this extEnumClass, the name gets mangled to something else.
100+
public func extEnumCls() {
101+
let u: publEnumClass = publEnumClassMake()
102+
publEnumClassTake(u)
103+
let i: privEnumClass = privEnumClassMake()
104+
privEnumClassTake(i)
105+
}
106+
// CHECK: define {{.*}}swiftcc void @"{{.*}}extEnumCls{{.*}}"
107+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumClassMake{{.*}}
108+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}publEnumClassTake{{.*}}
109+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumClassMake{{.*}}
110+
// CHECK: {{invoke|call}} {{.*}} @{{.*}}privEnumClassTake{{.*}}
111+
}

test/Interop/Cxx/class/access/private-fileid-typecheck.swift

+21-2
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,27 @@ extension MyClass {
120120
let _ = privEnumOpen.variantPrivEnumOpen
121121
}
122122

123-
func fcutd(_ _: publTypedef) { }
124-
private func fcitd(_ _: privTypedef) { }
123+
// Make sure these types are usable in type signatures too
124+
func publTypedefFunc(_ _: publTypedef) { }
125+
private func privTypedefFunc(_ _: privTypedef) { }
126+
127+
func publStructFunc(_ _: publStruct) { }
128+
private func privStructFunc(_ _: privStruct) { }
129+
130+
func publEnumFunc(_ _: publEnum) { }
131+
private func privEnumFunc(_ _: privEnum) { }
132+
133+
func publEnumClassFunc(_ _: publEnumClass) { }
134+
private func privEnumClassFunc(_ _: privEnumClass) { }
135+
136+
func publEnumClosedFunc(_ _: publEnumClosed) { }
137+
private func privEnumClosedFunc(_ _: privEnumClosed) { }
138+
139+
func publEnumOpenFunc(_ _: publEnumOpen) { }
140+
private func privEnumOpenFunc(_ _: privEnumOpen) { }
141+
142+
func publEnumFlagFunc(_ _: publEnumFlag) { }
143+
private func privEnumFlagFunc(_ _: privEnumFlag) { }
125144
}
126145

127146
func notExt(_ c: inout MyClass) {

0 commit comments

Comments
 (0)