Skip to content

Commit 8ec0991

Browse files
fix JitCall codegen for duplicate symbols within namespaces
1 parent c849ba4 commit 8ec0991

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

lib/CppInterOp/CppInterOp.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1925,6 +1925,7 @@ void get_type_as_string(QualType QT, std::string& type_name, ASTContext& C,
19251925
Policy.SuppressElaboration = true;
19261926
Policy.SuppressTagKeyword = !QT->isEnumeralType();
19271927
Policy.FullyQualifiedName = true;
1928+
Policy.UsePreferredNames = false;
19281929
QT.getAsStringInternal(type_name, Policy);
19291930
}
19301931

@@ -1934,6 +1935,7 @@ static void GetDeclName(const clang::Decl* D, ASTContext& Context,
19341935
PrintingPolicy Policy(Context.getPrintingPolicy());
19351936
Policy.SuppressTagKeyword = true;
19361937
Policy.SuppressUnwrittenScope = true;
1938+
Policy.PrintCanonicalTypes = true;
19371939
if (const TypeDecl* TD = dyn_cast<TypeDecl>(D)) {
19381940
// This is a class, struct, or union member.
19391941
QualType QT;

unittests/CppInterOp/FunctionReflectionTest.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2111,6 +2111,48 @@ TEST(FunctionReflectionTest, GetFunctionCallWrapper) {
21112111

21122112
auto op_callable = Cpp::MakeFunctionCallable(op);
21132113
EXPECT_EQ(op_callable.getKind(), Cpp::JitCall::kGenericCall);
2114+
2115+
Cpp::Declare(R"(
2116+
enum class MyEnum { A, B, C };
2117+
template <MyEnum E>
2118+
class TemplatedEnum {};
2119+
2120+
namespace MyNameSpace {
2121+
enum class MyEnum { A, B, C };
2122+
template <MyEnum E>
2123+
class TemplatedEnum {};
2124+
}
2125+
)");
2126+
2127+
Cpp::TCppScope_t TemplatedEnum = Cpp::GetScope("TemplatedEnum");
2128+
EXPECT_TRUE(TemplatedEnum);
2129+
2130+
auto TAI_enum =
2131+
Cpp::TemplateArgInfo(Cpp::GetTypeFromScope(Cpp::GetNamed("MyEnum")), "1");
2132+
Cpp::TCppScope_t TemplatedEnum_instantiated =
2133+
Cpp::InstantiateTemplate(TemplatedEnum, &TAI_enum, 1);
2134+
EXPECT_TRUE(TemplatedEnum_instantiated);
2135+
2136+
Cpp::TCppObject_t obj = Cpp::Construct(TemplatedEnum_instantiated);
2137+
EXPECT_TRUE(obj);
2138+
Cpp::Destruct(obj, TemplatedEnum_instantiated);
2139+
obj = nullptr;
2140+
2141+
Cpp::TCppScope_t MyNameSpace_TemplatedEnum =
2142+
Cpp::GetScope("TemplatedEnum", Cpp::GetScope("MyNameSpace"));
2143+
EXPECT_TRUE(TemplatedEnum);
2144+
2145+
TAI_enum = Cpp::TemplateArgInfo(Cpp::GetTypeFromScope(Cpp::GetNamed(
2146+
"MyEnum", Cpp::GetScope("MyNameSpace"))),
2147+
"1");
2148+
Cpp::TCppScope_t MyNameSpace_TemplatedEnum_instantiated =
2149+
Cpp::InstantiateTemplate(MyNameSpace_TemplatedEnum, &TAI_enum, 1);
2150+
EXPECT_TRUE(TemplatedEnum_instantiated);
2151+
2152+
obj = Cpp::Construct(MyNameSpace_TemplatedEnum_instantiated);
2153+
EXPECT_TRUE(obj);
2154+
Cpp::Destruct(obj, MyNameSpace_TemplatedEnum_instantiated);
2155+
obj = nullptr;
21142156
}
21152157

21162158
TEST(FunctionReflectionTest, IsConstMethod) {

0 commit comments

Comments
 (0)