Skip to content

Commit e85b658

Browse files
authored
Merge pull request swiftlang#31813 from gribozavr/add-tests
Added tests for edge cases in importing and mangling C structs
2 parents 82728d3 + 61d4793 commit e85b658

File tree

4 files changed

+290
-0
lines changed

4 files changed

+290
-0
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module StructDeclContext {
2+
header "struct-decl-context.h"
3+
export *
4+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#ifndef TEST_INTEROP_C_STRUCT_INPUTS_STRUCT_DECL_CONTEXT_H
2+
#define TEST_INTEROP_C_STRUCT_INPUTS_STRUCT_DECL_CONTEXT_H
3+
4+
// This header contains C structs that are declared and nested in various ways.
5+
// Some of these patterns are special-cased by ClangImporter (for example, the
6+
// names of typedefs become names of imported structs). Nested structs have been
7+
// historically imported in Swift according to C rules, that is, structs
8+
// lexically declared nested in other structs are imported into the global
9+
// namespace anyway.
10+
11+
struct StructRegular {
12+
struct StructNestedComplete1 {
13+
struct StructNestedNestedComplete1 {} complete_immediately_nested;
14+
struct StructNestedNestedCompletedLater1 *completed_later_nested;
15+
} complete_immediately;
16+
struct StructNestedCompletedLater1 *completed_later;
17+
};
18+
19+
struct StructNestedNestedCompletedLater1 {};
20+
struct StructNestedCompletedLater1 {};
21+
22+
typedef struct StructTypedefTag2 {
23+
struct StructNestedComplete2 {} complete_immediately;
24+
struct StructNestedCompletedLater2 *completed_later;
25+
} StructTypedefName2;
26+
27+
struct StructNestedCompletedLater2 {};
28+
29+
typedef struct {
30+
struct StructNestedComplete3 {} complete_immediately;
31+
struct StructNestedCompletedLater3 *completed_later;
32+
} StructTypedefName3;
33+
34+
struct StructNestedCompletedLater3 {};
35+
36+
typedef struct StructTypedefTag4 {
37+
struct StructNestedComplete4 {} complete_immediately;
38+
struct StructNestedCompletedLater4 *completed_later;
39+
} *StructTypedefName4;
40+
41+
struct StructNestedCompletedLater4 {};
42+
43+
typedef struct {
44+
struct StructNestedComplete5 {} complete_immediately;
45+
struct StructNestedCompletedLater5 *completed_later;
46+
} *StructTypedefName5;
47+
48+
struct StructNestedCompletedLater5 {};
49+
50+
typedef struct {
51+
struct StructNestedComplete6 {} complete_immediately;
52+
struct StructNestedCompletedLater6 *completed_later;
53+
} StructTypedefName6, *StructTypedefName6Ptr;
54+
55+
struct StructNestedCompletedLater6 {};
56+
57+
typedef struct {
58+
struct StructNestedComplete7 {} complete_immediately;
59+
struct StructNestedCompletedLater7 *completed_later;
60+
} *StructTypedefName7Ptr, StructTypedefName7;
61+
62+
struct StructNestedCompletedLater7 {};
63+
64+
typedef struct {
65+
struct StructNestedComplete8 {} complete_immediately;
66+
struct StructNestedCompletedLater8 *completed_later;
67+
} StructTypedefName8, *StructTypedefName8Ptr, **StructTypedefName8PtrPtr;
68+
69+
struct StructNestedCompletedLater8 {};
70+
71+
#endif
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// RUN: %target-swift-emit-ir -I %S/Inputs %s | %FileCheck %s
2+
3+
// This test checks that structs that are imported from a C module are mangled
4+
// in Swift names as if they are declared in the global namespace, even when
5+
// they are lexically declared nested in other C structs.
6+
7+
import StructDeclContext
8+
9+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo13StructRegularVF"({{.*}})
10+
public func take(_ x: StructRegular) {}
11+
12+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete1VF"({{.*}})
13+
public func take(_: StructNestedComplete1) {}
14+
15+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo012StructNestedD9Complete1VF"({{.*}})
16+
public func take(_: StructNestedNestedComplete1) {}
17+
18+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo012StructNestedD15CompletedLater1VF"({{.*}})
19+
public func take(_: StructNestedNestedCompletedLater1) {}
20+
21+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater1VF"({{.*}})
22+
public func take(_: StructNestedCompletedLater1) {}
23+
24+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo17StructTypedefTag2VF"({{.*}})
25+
public func take(_: StructTypedefTag2) {}
26+
27+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete2VF"({{.*}})
28+
public func take(_: StructNestedComplete2) {}
29+
30+
// CHECK-LABEL: define {{.*}} void @"$s4main5take2yySo17StructTypedefTag2VF"({{.*}})
31+
public func take2(_: StructTypedefName2) {}
32+
33+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater2VF"({{.*}})
34+
public func take(_: StructNestedCompletedLater2) {}
35+
36+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo18StructTypedefName3aF"({{.*}})
37+
public func take(_: StructTypedefName3) {}
38+
39+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete3VF"({{.*}})
40+
public func take(_: StructNestedComplete3) {}
41+
42+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater3VF"({{.*}})
43+
public func take(_: StructNestedCompletedLater3) {}
44+
45+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo17StructTypedefTag4VF"({{.*}})
46+
public func take(_: StructTypedefTag4) {}
47+
48+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete4VF"({{.*}})
49+
public func take(_: StructNestedComplete4) {}
50+
51+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySpySo17StructTypedefTag4VGF"(i8* %0)
52+
public func take(_: StructTypedefName4) {}
53+
54+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater4VF"({{.*}})
55+
public func take(_: StructNestedCompletedLater4) {}
56+
57+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete5VF"({{.*}})
58+
public func take(_: StructNestedComplete5) {}
59+
60+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyys13OpaquePointerVF"(i8* %0)
61+
public func take(_: StructTypedefName5) {}
62+
63+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater5VF"({{.*}})
64+
public func take(_: StructNestedCompletedLater5) {}
65+
66+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo18StructTypedefName6aF"({{.*}})
67+
public func take(_: StructTypedefName6) {}
68+
69+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete6VF"({{.*}})
70+
public func take(_: StructNestedComplete6) {}
71+
72+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySpySo18StructTypedefName6aGF"(i8* %0)
73+
public func take(_: StructTypedefName6Ptr) {}
74+
75+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater6VF"({{.*}})
76+
public func take(_: StructNestedCompletedLater6) {}
77+
78+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo18StructTypedefName7aF"({{.*}})
79+
public func take(_: StructTypedefName7) {}
80+
81+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete7VF"({{.*}})
82+
public func take(_: StructNestedComplete7) {}
83+
84+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySpySo18StructTypedefName7aGF"(i8* %0)
85+
public func take(_: StructTypedefName7Ptr) {}
86+
87+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater7VF"({{.*}})
88+
public func take(_: StructNestedCompletedLater7) {}
89+
90+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo18StructTypedefName8aF"({{.*}})
91+
public func take(_: StructTypedefName8) {}
92+
93+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo21StructNestedComplete8VF"({{.*}})
94+
public func take(_: StructNestedComplete8) {}
95+
96+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySpySo18StructTypedefName8aGF"(i8* %0)
97+
public func take(_: StructTypedefName8Ptr) {}
98+
99+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySpySpySo18StructTypedefName8aGSgGF"(i8* %0)
100+
public func take(_: StructTypedefName8PtrPtr) {}
101+
102+
// CHECK-LABEL: define {{.*}} void @"$s4main4takeyySo27StructNestedCompletedLater8VF"({{.*}})
103+
public func take(_: StructNestedCompletedLater8) {}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
// RUN: %target-swift-ide-test -print-module -module-to-print=StructDeclContext -I %S/Inputs -source-filename=x | %FileCheck %s
2+
3+
// This test checks that structs that are imported from a C module are imported
4+
// into the top-level scope in Swift, even when they are lexically declared
5+
// nested in other C structs.
6+
7+
// CHECK: struct StructRegular {
8+
// CHECK-NEXT: var complete_immediately: StructNestedComplete1
9+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater1>!
10+
// CHECK-NEXT: init()
11+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete1, completed_later: UnsafeMutablePointer<StructNestedCompletedLater1>!)
12+
// CHECK-NEXT: }
13+
// CHECK-NEXT: struct StructNestedComplete1 {
14+
// CHECK-NEXT: var complete_immediately_nested: StructNestedNestedComplete1
15+
// CHECK-NEXT: var completed_later_nested: UnsafeMutablePointer<StructNestedNestedCompletedLater1>!
16+
// CHECK-NEXT: init()
17+
// CHECK-NEXT: init(complete_immediately_nested: StructNestedNestedComplete1, completed_later_nested: UnsafeMutablePointer<StructNestedNestedCompletedLater1>!)
18+
// CHECK-NEXT: }
19+
// CHECK-NEXT: struct StructNestedNestedComplete1 {
20+
// CHECK-NEXT: init()
21+
// CHECK-NEXT: }
22+
// CHECK-NEXT: struct StructNestedNestedCompletedLater1 {
23+
// CHECK-NEXT: init()
24+
// CHECK-NEXT: }
25+
// CHECK-NEXT: struct StructNestedCompletedLater1 {
26+
// CHECK-NEXT: init()
27+
// CHECK-NEXT: }
28+
// CHECK-NEXT: struct StructTypedefTag2 {
29+
// CHECK-NEXT: var complete_immediately: StructNestedComplete2
30+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater2>!
31+
// CHECK-NEXT: init()
32+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete2, completed_later: UnsafeMutablePointer<StructNestedCompletedLater2>!)
33+
// CHECK-NEXT: }
34+
// CHECK-NEXT: struct StructNestedComplete2 {
35+
// CHECK-NEXT: init()
36+
// CHECK-NEXT: }
37+
// CHECK-NEXT: typealias StructTypedefName2 = StructTypedefTag2
38+
// CHECK-NEXT: struct StructNestedCompletedLater2 {
39+
// CHECK-NEXT: init()
40+
// CHECK-NEXT: }
41+
// CHECK-NEXT: struct StructTypedefName3 {
42+
// CHECK-NEXT: var complete_immediately: StructNestedComplete3
43+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater3>!
44+
// CHECK-NEXT: init()
45+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete3, completed_later: UnsafeMutablePointer<StructNestedCompletedLater3>!)
46+
// CHECK-NEXT: }
47+
// CHECK-NEXT: struct StructNestedComplete3 {
48+
// CHECK-NEXT: init()
49+
// CHECK-NEXT: }
50+
// CHECK-NEXT: struct StructNestedCompletedLater3 {
51+
// CHECK-NEXT: init()
52+
// CHECK-NEXT: }
53+
// CHECK-NEXT: struct StructTypedefTag4 {
54+
// CHECK-NEXT: var complete_immediately: StructNestedComplete4
55+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater4>!
56+
// CHECK-NEXT: init()
57+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete4, completed_later: UnsafeMutablePointer<StructNestedCompletedLater4>!)
58+
// CHECK-NEXT: }
59+
// CHECK-NEXT: struct StructNestedComplete4 {
60+
// CHECK-NEXT: init()
61+
// CHECK-NEXT: }
62+
// CHECK-NEXT: typealias StructTypedefName4 = UnsafeMutablePointer<StructTypedefTag4>
63+
// CHECK-NEXT: struct StructNestedCompletedLater4 {
64+
// CHECK-NEXT: init()
65+
// CHECK-NEXT: }
66+
// CHECK-NEXT: struct StructNestedComplete5 {
67+
// CHECK-NEXT: init()
68+
// CHECK-NEXT: }
69+
// CHECK-NEXT: typealias StructTypedefName5 = OpaquePointer
70+
// CHECK-NEXT: struct StructNestedCompletedLater5 {
71+
// CHECK-NEXT: init()
72+
// CHECK-NEXT: }
73+
// CHECK-NEXT: struct StructTypedefName6 {
74+
// CHECK-NEXT: var complete_immediately: StructNestedComplete6
75+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater6>!
76+
// CHECK-NEXT: init()
77+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete6, completed_later: UnsafeMutablePointer<StructNestedCompletedLater6>!)
78+
// CHECK-NEXT: }
79+
// CHECK-NEXT: struct StructNestedComplete6 {
80+
// CHECK-NEXT: init()
81+
// CHECK-NEXT: }
82+
// CHECK-NEXT: typealias StructTypedefName6Ptr = UnsafeMutablePointer<StructTypedefName6>
83+
// CHECK-NEXT: struct StructNestedCompletedLater6 {
84+
// CHECK-NEXT: init()
85+
// CHECK-NEXT: }
86+
// CHECK-NEXT: struct StructTypedefName7 {
87+
// CHECK-NEXT: var complete_immediately: StructNestedComplete7
88+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater7>!
89+
// CHECK-NEXT: init()
90+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete7, completed_later: UnsafeMutablePointer<StructNestedCompletedLater7>!)
91+
// CHECK-NEXT: }
92+
// CHECK-NEXT: struct StructNestedComplete7 {
93+
// CHECK-NEXT: init()
94+
// CHECK-NEXT: }
95+
// CHECK-NEXT: typealias StructTypedefName7Ptr = UnsafeMutablePointer<StructTypedefName7>
96+
// CHECK-NEXT: struct StructNestedCompletedLater7 {
97+
// CHECK-NEXT: init()
98+
// CHECK-NEXT: }
99+
// CHECK-NEXT: struct StructTypedefName8 {
100+
// CHECK-NEXT: var complete_immediately: StructNestedComplete8
101+
// CHECK-NEXT: var completed_later: UnsafeMutablePointer<StructNestedCompletedLater8>!
102+
// CHECK-NEXT: init()
103+
// CHECK-NEXT: init(complete_immediately: StructNestedComplete8, completed_later: UnsafeMutablePointer<StructNestedCompletedLater8>!)
104+
// CHECK-NEXT: }
105+
// CHECK-NEXT: struct StructNestedComplete8 {
106+
// CHECK-NEXT: init()
107+
// CHECK-NEXT: }
108+
// CHECK-NEXT: typealias StructTypedefName8Ptr = UnsafeMutablePointer<StructTypedefName8>
109+
// CHECK-NEXT: typealias StructTypedefName8PtrPtr = UnsafeMutablePointer<UnsafeMutablePointer<StructTypedefName8>?>
110+
// CHECK-NEXT: struct StructNestedCompletedLater8 {
111+
// CHECK-NEXT: init()
112+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)