Skip to content

Commit 2085938

Browse files
committed
[cxx-interop] Add test case that checks irgen for imported private members
1 parent f61a3c9 commit 2085938

File tree

3 files changed

+165
-10
lines changed

3 files changed

+165
-10
lines changed

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

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

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

Lines changed: 21 additions & 2 deletions
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)