Skip to content

Commit 07ae675

Browse files
fix: codegen for nested namespace with using (#612)
1 parent 7f33134 commit 07ae675

File tree

2 files changed

+97
-3
lines changed

2 files changed

+97
-3
lines changed

lib/CppInterOp/CppInterOp.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,13 @@ std::string GetQualifiedCompleteName(TCppType_t klass) {
547547
if (auto* TD = llvm::dyn_cast<TagDecl>(ND)) {
548548
std::string type_name;
549549
QualType QT = C.getTagDeclType(TD);
550-
QT.getAsStringInternal(type_name, C.getPrintingPolicy());
550+
PrintingPolicy PP = C.getPrintingPolicy();
551+
PP.FullyQualifiedName = true;
552+
PP.SuppressUnwrittenScope = true;
553+
#if CLANG_VERSION_MAJOR > 16
554+
PP.SuppressElaboration = true;
555+
#endif
556+
QT.getAsStringInternal(type_name, PP);
551557

552558
return type_name;
553559
}
@@ -630,7 +636,8 @@ TCppScope_t GetScope(const std::string& name, TCppScope_t parent) {
630636
return 0;
631637

632638
if (llvm::isa<NamespaceDecl>(ND) || llvm::isa<RecordDecl>(ND) ||
633-
llvm::isa<ClassTemplateDecl>(ND) || llvm::isa<TypedefNameDecl>(ND))
639+
llvm::isa<ClassTemplateDecl>(ND) || llvm::isa<TypedefNameDecl>(ND) ||
640+
llvm::isa<TypeAliasTemplateDecl>(ND) || llvm::isa<TypeAliasDecl>(ND))
634641
return (TCppScope_t)(ND->getCanonicalDecl());
635642

636643
return 0;
@@ -2012,7 +2019,13 @@ void make_narg_call(const FunctionDecl* FD, const std::string& return_type,
20122019
{
20132020
std::string complete_name;
20142021
llvm::raw_string_ostream stream(complete_name);
2015-
FD->getNameForDiagnostic(stream, FD->getASTContext().getPrintingPolicy(),
2022+
PrintingPolicy PP = FD->getASTContext().getPrintingPolicy();
2023+
PP.FullyQualifiedName = true;
2024+
PP.SuppressUnwrittenScope = true;
2025+
#if CLANG_VERSION_MAJOR > 16
2026+
PP.SuppressElaboration = true;
2027+
#endif
2028+
FD->getNameForDiagnostic(stream, PP,
20162029
/*Qualified=*/false);
20172030

20182031
// insert space between template argument list and the function name

unittests/CppInterOp/FunctionReflectionTest.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,87 @@ TEST(FunctionReflectionTest, GetFunctionCallWrapper) {
17331733
Cpp::BestOverloadFunctionMatch(operators, {}, {K1, K2});
17341734
auto chrono_op_fn_callable = Cpp::MakeFunctionCallable(kop);
17351735
EXPECT_EQ(chrono_op_fn_callable.getKind(), Cpp::JitCall::kGenericCall);
1736+
1737+
Interp->process(R"(
1738+
namespace my_std {
1739+
template <typename T1, typename T2>
1740+
struct pair {
1741+
T1 first;
1742+
T2 second;
1743+
pair(T1 fst, T2 snd) : first(fst), second(snd) {}
1744+
};
1745+
1746+
template <typename T1, typename T2>
1747+
pair<T1, T2> make_pair(T1 x, T2 y) {
1748+
return pair<T1, T2>(x, y);
1749+
}
1750+
1751+
template <int _Int>
1752+
struct __pair_get;
1753+
1754+
template <>
1755+
struct __pair_get<0> {
1756+
template <typename T1, typename T2>
1757+
static constexpr T1 __get(pair<T1, T2> __pair) noexcept {
1758+
return __pair.first;
1759+
}
1760+
};
1761+
1762+
template <>
1763+
struct __pair_get<1> {
1764+
template <typename T1, typename T2>
1765+
constexpr T2 __get(pair<T1, T2> __pair) noexcept {
1766+
return __pair.second;
1767+
}
1768+
};
1769+
1770+
template <int N, typename T1, typename T2>
1771+
static constexpr auto get(pair<T1, T2> __t) noexcept {
1772+
return __pair_get<N>::__get(__t);
1773+
}
1774+
} // namespace my_std
1775+
1776+
namespace libchemist {
1777+
namespace type {
1778+
template <typename T>
1779+
class tensor {};
1780+
} // namespace type
1781+
1782+
template <typename element_type = double,
1783+
typename tensor_type = type::tensor<element_type>>
1784+
class CanonicalMO {};
1785+
1786+
template class CanonicalMO<double, type::tensor<double>>;
1787+
1788+
auto produce() { return my_std::make_pair(10., type::tensor<double>{}); }
1789+
1790+
} // namespace libchemist
1791+
1792+
namespace property_types {
1793+
namespace type {
1794+
template <typename T>
1795+
using canonical_mos = libchemist::CanonicalMO<T>;
1796+
}
1797+
1798+
auto produce() { return my_std::make_pair(5., type::canonical_mos<double>{}); }
1799+
} // namespace property_types
1800+
1801+
auto tmp = property_types::produce();
1802+
auto &p = tmp;
1803+
)");
1804+
1805+
std::vector<Cpp::TCppFunction_t> unresolved_candidate_methods;
1806+
Cpp::GetClassTemplatedMethods("get", Cpp::GetScope("my_std"),
1807+
unresolved_candidate_methods);
1808+
Cpp::TCppType_t p = Cpp::GetTypeFromScope(Cpp::GetNamed("p"));
1809+
EXPECT_TRUE(p);
1810+
1811+
Cpp::TCppScope_t fn = Cpp::BestOverloadFunctionMatch(
1812+
unresolved_candidate_methods, {{Cpp::GetType("int"), "0"}}, {p});
1813+
EXPECT_TRUE(fn);
1814+
1815+
auto fn_callable = Cpp::MakeFunctionCallable(fn);
1816+
EXPECT_EQ(fn_callable.getKind(), Cpp::JitCall::kGenericCall);
17361817
}
17371818

17381819
TEST(FunctionReflectionTest, IsConstMethod) {

0 commit comments

Comments
 (0)