add dealias for Resolver.

This commit is contained in:
ykiko
2024-09-07 11:11:41 +08:00
parent 76b33d1f7c
commit 4e331bc8a2
3 changed files with 83 additions and 14 deletions

View File

@@ -97,7 +97,6 @@ template <typename X>
struct test {
using result = typename C<X>::type;
};
)";
Visitor visitor(code);
clang::QualType result = visitor.test();
@@ -129,7 +128,6 @@ template <typename X>
struct test {
using result = typename A<X>::self::self::self::self::self::type;
};
)";
Visitor visitor(code);
clang::QualType result = visitor.test();
@@ -146,5 +144,41 @@ struct test {
ASSERT_EQ(T->getDecl()->getName(), "X");
}
TEST(DependentNameResolver, alias_dependent_name) {
const char* code = R"(
template <typename ...Ts>
struct type_list {};
template <typename T1>
struct A {
using type = type_list<T1>;
};
template <typename T2>
struct B {
using base = A<T2>;
using type = typename base::type;
};
template <typename X>
struct test {
using result = typename B<X>::type;
};
)";
Visitor visitor(code);
clang::QualType result = visitor.test();
// result->dump();
auto TST = result->getAs<clang::TemplateSpecializationType>();
ASSERT_TRUE(TST);
ASSERT_EQ(TST->getTemplateName().getAsTemplateDecl()->getName(), "type_list");
auto args = TST->template_arguments();
ASSERT_EQ(args.size(), 1);
auto T = llvm::dyn_cast<clang::TemplateTypeParmType>(args[0].getAsType());
ASSERT_TRUE(T);
ASSERT_EQ(T->getDecl()->getName(), "X");
}
} // namespace