Skip to content

Commit 51fbf0c

Browse files
Merge pull request swiftlang#26175 from varungandhi-apple/vg-fix-sr-10571
Use name mangling to disambiguate field names when types are anonymous.
2 parents 05d2ef2 + 009d0e5 commit 51fbf0c

File tree

5 files changed

+73
-14
lines changed

5 files changed

+73
-14
lines changed

lib/ClangImporter/ImportDecl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "ImporterImpl.h"
1919
#include "swift/Strings.h"
2020
#include "swift/AST/ASTContext.h"
21+
#include "swift/AST/ASTMangler.h"
2122
#include "swift/AST/GenericSignatureBuilder.h"
2223
#include "swift/AST/Attr.h"
2324
#include "swift/AST/Builtins.h"
@@ -1073,7 +1074,8 @@ getAccessorDeclarationName(clang::ASTContext &Ctx,
10731074
const char *suffix) {
10741075
std::string id;
10751076
llvm::raw_string_ostream IdStream(id);
1076-
IdStream << "$" << structDecl->getName()
1077+
Mangle::ASTMangler mangler;
1078+
IdStream << "$" << mangler.mangleDeclAsUSR(structDecl, "")
10771079
<< "$" << fieldDecl->getName()
10781080
<< "$" << suffix;
10791081

test/ClangImporter/Inputs/custom-modules/IndirectFields.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,26 @@ struct StructWithIndirectField {
77
int d : 3; /* Imported as a computed property */
88
};
99

10+
struct StructWithIndirectField2 {
11+
union {
12+
unsigned v;
13+
struct {
14+
unsigned x : 8;
15+
unsigned y : 8;
16+
};
17+
};
18+
};
19+
20+
struct StructWithIndirectField2Copy {
21+
union {
22+
unsigned v;
23+
struct {
24+
unsigned x : 16;
25+
unsigned y : 16;
26+
};
27+
};
28+
};
29+
1030
union UnionWithIndirectField {
1131
struct {
1232
int a;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// RUN: %target-swift-frontend -emit-silgen -I %S/Inputs/custom-modules %s | %FileCheck %s
2+
3+
// https://bugs.swift.org/browse/SR-10571
4+
5+
import IndirectFields
6+
7+
extension StructWithIndirectField2Copy {
8+
init(x: UInt32, y: UInt32) {
9+
self.init(.init(v: x + y))
10+
}
11+
12+
init(s: StructWithIndirectField2) {
13+
self.init(x: s.x, y: s.y)
14+
}
15+
}
16+
17+
// The names look complex because we assign names to unnamed unions/structs
18+
// using a mangling scheme which the Swift demangler doesn't understand.
19+
20+
// CHECK-DAG: sil shared @$So24StructWithIndirectField2V34__Unnamed_union___Anonymous_field0V02__e10_struct___G7_field1V$x$getter : $@convention(c) (StructWithIndirectField2.__Unnamed_union___Anonymous_field0.__Unnamed_struct___Anonymous_field1) -> UInt32
21+
22+
// CHECK-DAG: sil shared @$So24StructWithIndirectField2V34__Unnamed_union___Anonymous_field0V02__e10_struct___G7_field1V$y$getter : $@convention(c) (StructWithIndirectField2.__Unnamed_union___Anonymous_field0.__Unnamed_struct___Anonymous_field1) -> UInt32
23+
24+
// CHECK-DAG: sil shared @$So28StructWithIndirectField2CopyV34__Unnamed_union___Anonymous_field0V02__f10_struct___H7_field1V$x$getter : $@convention(c) (StructWithIndirectField2Copy.__Unnamed_union___Anonymous_field0.__Unnamed_struct___Anonymous_field1) -> UInt32
25+
26+
// CHECK-DAG: sil shared @$So28StructWithIndirectField2CopyV34__Unnamed_union___Anonymous_field0V02__f10_struct___H7_field1V$x$setter : $@convention(c) (UInt32, @inout StructWithIndirectField2Copy.__Unnamed_union___Anonymous_field0.__Unnamed_struct___Anonymous_field1) -> ()
27+
28+
// CHECK-DAG: sil shared @$So28StructWithIndirectField2CopyV34__Unnamed_union___Anonymous_field0V02__f10_struct___H7_field1V$y$getter : $@convention(c) (StructWithIndirectField2Copy.__Unnamed_union___Anonymous_field0.__Unnamed_struct___Anonymous_field1) -> UInt32
29+
30+
// CHECK-DAG: sil shared @$So28StructWithIndirectField2CopyV34__Unnamed_union___Anonymous_field0V02__f10_struct___H7_field1V$y$setter : $@convention(c) (UInt32, @inout StructWithIndirectField2Copy.__Unnamed_union___Anonymous_field0.__Unnamed_struct___Anonymous_field1) -> ()
31+
32+
func test() -> UInt32 {
33+
var s = StructWithIndirectField2Copy(x: 1, y: 2)
34+
s.x = 10
35+
s.y = 11
36+
return s.x + s.y
37+
}

test/ClangImporter/inlinable_bitfields.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ public func g(_ m: MM) -> UInt32 {
1010

1111
// Just make sure this is a definition and not a declaration...
1212

13-
// CHECK: define internal{{( zeroext)?}} i32 @"$ModRM$rm$getter"
13+
// CHECK: define internal{{( zeroext)?}} i32 @"$So5ModRMV$rm$getter"

test/multifile/batch_mode_external_definitions.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
//
2020
// CHECK-FIELD1-ONLY: sil_stage canonical
2121
// CHECK-FIELD1-ONLY: use_extern_struct_field_1
22-
// CHECK-FIELD1-ONLY: sil shared{{.*}}extern_struct$field$getter
23-
// CHECK-FIELD1-ONLY-NOT: sil shared{{.*}}extern_struct$field$getter
22+
// CHECK-FIELD1-ONLY: sil shared{{.*}}@$So13extern_structV$field$getter
23+
// CHECK-FIELD1-ONLY-NOT: sil shared{{.*}}@$So13extern_structV$field$getter
2424
// CHECK-FIELD1-ONLY: sil_stage canonical
2525
// CHECK-FIELD1-ONLY-NOT: use_extern_struct_field_2
2626
// CHECK-FIELD1-ONLY-NOT: sil shared{{.*}}extern_struct$field$getter
@@ -30,33 +30,33 @@
3030
// CHECK-FIELD1-ONLY-REORDER-NOT: sil shared{{.*}}extern_struct$field$getter
3131
// CHECK-FIELD1-ONLY-REORDER: sil_stage canonical
3232
// CHECK-FIELD1-ONLY-REORDER: use_extern_struct_field_1
33-
// CHECK-FIELD1-ONLY-REORDER: sil shared{{.*}}extern_struct$field$getter
34-
// CHECK-FIELD1-ONLY-REORDER-NOT: sil shared{{.*}}extern_struct$field$getter
33+
// CHECK-FIELD1-ONLY-REORDER: sil shared{{.*}}@$So13extern_structV$field$getter
34+
// CHECK-FIELD1-ONLY-REORDER-NOT: sil shared{{.*}}@$So13extern_structV$field$getter
3535
//
3636
// CHECK-FIELD2-ONLY: sil_stage canonical
3737
// CHECK-FIELD2-ONLY-NOT: use_extern_struct_field_1
3838
// CHECK-FIELD2-ONLY-NOT: sil shared{{.*}}extern_struct$field$getter
3939
// CHECK-FIELD2-ONLY: sil_stage canonical
4040
// CHECK-FIELD2-ONLY: use_extern_struct_field_2
41-
// CHECK-FIELD2-ONLY: sil shared{{.*}}extern_struct$field$getter
42-
// CHECK-FIELD2-ONLY-NOT: sil shared{{.*}}extern_struct$field$getter
41+
// CHECK-FIELD2-ONLY: sil shared{{.*}}@$So13extern_structV$field$getter
42+
// CHECK-FIELD2-ONLY-NOT: sil shared{{.*}}@$So13extern_structV$field$getter
4343
//
4444
// CHECK-FIELD2-ONLY-REORDER: sil_stage canonical
4545
// CHECK-FIELD2-ONLY-REORDER: use_extern_struct_field_2
46-
// CHECK-FIELD2-ONLY-REORDER: sil shared{{.*}}extern_struct$field$getter
47-
// CHECK-FIELD2-ONLY-REORDER-NOT: sil shared{{.*}}extern_struct$field$getter
46+
// CHECK-FIELD2-ONLY-REORDER: sil shared{{.*}}@$So13extern_structV$field$getter
47+
// CHECK-FIELD2-ONLY-REORDER-NOT: sil shared{{.*}}@$So13extern_structV$field$getter
4848
// CHECK-FIELD2-ONLY-REORDER: sil_stage canonical
4949
// CHECK-FIELD2-ONLY-REORDER-NOT: use_extern_struct_field_1
5050
// CHECK-FIELD2-ONLY-REORDER-NOT: sil shared{{.*}}extern_struct$field$getter
5151
//
5252
// CHECK-BOTH-FIELDS: sil_stage canonical
5353
// CHECK-BOTH-FIELDS: use_extern_struct_field_1
54-
// CHECK-BOTH-FIELDS: sil shared{{.*}}extern_struct$field$getter
55-
// CHECK-BOTH-FIELDS-NOT: sil shared{{.*}}extern_struct$field$getter
54+
// CHECK-BOTH-FIELDS: sil shared{{.*}}@$So13extern_structV$field$getter
55+
// CHECK-BOTH-FIELDS-NOT: sil shared{{.*}}@$So13extern_structV$field$getter
5656
// CHECK-BOTH-FIELDS: sil_stage canonical
5757
// CHECK-BOTH-FIELDS: use_extern_struct_field_2
58-
// CHECK-BOTH-FIELDS: sil shared{{.*}}extern_struct$field$getter
59-
// CHECK-BOTH-FIELDS-NOT: sil shared{{.*}}extern_struct$field$getter
58+
// CHECK-BOTH-FIELDS: sil shared{{.*}}@$So13extern_structV$field$getter
59+
// CHECK-BOTH-FIELDS-NOT: sil shared{{.*}}@$So13extern_structV$field$getter
6060
//
6161
// CHECK-NEITHER-FIELD: sil_stage canonical
6262
// CHECK-NEITHER-FIELD-NOT: use_extern_struct_field_1

0 commit comments

Comments
 (0)