Skip to content

Commit 7f1792a

Browse files
authored
Merge pull request #79791 from swiftlang/susmonteiro/enums-same-gen-name
[cxx-interop] Use qualified name in import info of clang declarations
2 parents 4c60e03 + 18ee0ee commit 7f1792a

File tree

4 files changed

+87
-3
lines changed

4 files changed

+87
-3
lines changed

lib/IRGen/GenMeta.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1435,7 +1435,7 @@ namespace {
14351435

14361436
// For related entities, set the original type name as the ABI name
14371437
// and remember the related entity tag.
1438-
StringRef abiName;
1438+
std::string abiName;
14391439
if (auto *synthesizedTypeAttr =
14401440
Type->getAttrs()
14411441
.template getAttribute<ClangImporterSynthesizedTypeAttr>()) {
@@ -1455,7 +1455,7 @@ namespace {
14551455
if (auto spec = dyn_cast<clang::ClassTemplateSpecializationDecl>(clangDecl))
14561456
abiName = Type->getName().str();
14571457
else
1458-
abiName = clangDecl->getName();
1458+
abiName = clangDecl->getQualifiedNameAsString();
14591459

14601460
// Typedefs and compatibility aliases that have been promoted to
14611461
// their own nominal types need to be marked specially.
@@ -1469,7 +1469,7 @@ namespace {
14691469
// If the ABI name differs from the user-facing name, add it as
14701470
// an override.
14711471
if (!abiName.empty() && abiName != UserFacingName) {
1472-
getMutableImportInfo().ABIName = std::string(abiName);
1472+
getMutableImportInfo().ABIName = abiName;
14731473
}
14741474
}
14751475

test/Interop/Cxx/enum/Inputs/nested-enums.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,46 @@ enum EnumInNestedNS {
2020
kNestedB
2121
};
2222

23+
enum EnumInNS {
24+
kA = 0,
25+
kB
26+
};
27+
2328
}
2429

2530
}
2631

32+
namespace nsB {
33+
34+
enum EnumInNS {
35+
kA = 0,
36+
kB
37+
};
38+
39+
enum class ScopedEnumInNS {
40+
scopeA,
41+
scopeB
42+
};
43+
44+
namespace nestedNS {
45+
46+
enum EnumInNS {
47+
kA = 0,
48+
kB
49+
};
50+
51+
}
52+
53+
}
54+
55+
class ClassA {
56+
public:
57+
enum class EnumInClass { scopeA, scopeB };
58+
};
59+
60+
class ClassB {
61+
public:
62+
enum class EnumInClass { scopeA, scopeB };
63+
};
64+
2765
#endif // TEST_INTEROP_CXX_ENUM_INPUTS_NESTED_ENUMS_H

test/Interop/Cxx/enum/nested-enums-module-interface.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,9 @@
1414
// CHECK: }
1515
// CHECK-NEXT: static var kNestedA: ns.nestedNS.EnumInNestedNS { get }
1616
// CHECK-NEXT: static var kNestedB: ns.nestedNS.EnumInNestedNS { get }
17+
// CHECK-NEXT: struct EnumInNS : Hashable, Equatable, RawRepresentable {
18+
// CHECK: }
19+
// CHECK-NEXT: static var kA: ns.nestedNS.EnumInNS { get }
20+
// CHECK-NEXT: static var kB: ns.nestedNS.EnumInNS { get }
1721
// CHECK-NEXT: }
1822
// CHECK-NEXT:}

test/Interop/Cxx/enum/nested-enums.swift

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,46 @@ NestedEnumsTestSuite.test("Make and compare") {
1414
expectNotEqual(valNested, ns.nestedNS.kNestedB)
1515
}
1616

17+
NestedEnumsTestSuite.test("Same enum, different namespaces") {
18+
let nsEnum1 : ns.EnumInNS = ns.kA
19+
let nsEnum2 : ns.EnumInNS = ns.kA
20+
21+
let nsBEnum1 : nsB.EnumInNS = nsB.kA
22+
let nsBEnum2 : nsB.EnumInNS = nsB.kA
23+
24+
expectEqual(nsEnum1, nsEnum2)
25+
expectEqual(nsBEnum1, nsBEnum2)
26+
27+
let nsNestedEnum1 : ns.nestedNS.EnumInNS = ns.nestedNS.kA
28+
let nsNestedEnum2 : ns.nestedNS.EnumInNS = ns.nestedNS.kA
29+
30+
let nsBNestedEnum1 : nsB.nestedNS.EnumInNS = nsB.nestedNS.kA
31+
let nsBNestedEnum2 : nsB.nestedNS.EnumInNS = nsB.nestedNS.kA
32+
33+
expectEqual(nsNestedEnum1, nsNestedEnum2)
34+
expectEqual(nsBNestedEnum1, nsBNestedEnum2)
35+
}
36+
37+
NestedEnumsTestSuite.test("Same enum class, different namespaces") {
38+
let nsEnumClass1 : ns.ScopedEnumInNS = ns.ScopedEnumInNS.scopeA
39+
let nsEnumClass2 : ns.ScopedEnumInNS = ns.ScopedEnumInNS.scopeA
40+
41+
let nsBEnumClass1 : nsB.ScopedEnumInNS = nsB.ScopedEnumInNS.scopeA
42+
let nsBEnumClass2 : nsB.ScopedEnumInNS = nsB.ScopedEnumInNS.scopeA
43+
44+
expectEqual(nsEnumClass1, nsEnumClass2)
45+
expectEqual(nsBEnumClass1, nsBEnumClass2)
46+
}
47+
48+
NestedEnumsTestSuite.test("Same enum class, different classes") {
49+
let classAEnum1 : ClassA.EnumInClass = .scopeA
50+
let classAEnum2 : ClassA.EnumInClass = .scopeA
51+
52+
let classBEnum1 : ClassB.EnumInClass = .scopeA
53+
let classBEnum2 : ClassB.EnumInClass = .scopeA
54+
55+
expectEqual(classAEnum1, classAEnum2)
56+
expectEqual(classBEnum1, classBEnum2)
57+
}
58+
1759
runAllTests()

0 commit comments

Comments
 (0)