Skip to content

Commit 11c0183

Browse files
fix JitCall codegen for duplicate symbols within namespaces (#696)
1 parent 41f26a3 commit 11c0183

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
@@ -2112,6 +2112,48 @@ TEST(FunctionReflectionTest, GetFunctionCallWrapper) {
21122112

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

21172159
TEST(FunctionReflectionTest, IsConstMethod) {

0 commit comments

Comments
 (0)