Skip to content

Commit 025ce9f

Browse files
fix GetNumBases to handle templated typedefs
1 parent 82f08c6 commit 025ce9f

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

lib/CppInterOp/CppInterOp.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,12 @@ TCppScope_t GetParentScope(TCppScope_t scope) {
716716
TCppIndex_t GetNumBases(TCppScope_t klass) {
717717
auto* D = (Decl*)klass;
718718

719+
if (auto* CTSD = llvm::dyn_cast_or_null<ClassTemplateSpecializationDecl>(D)) {
720+
if (!CTSD->hasDefinition())
721+
getSema().InstantiateClassTemplateSpecialization(
722+
SourceLocation::getFromRawEncoding(1), CTSD,
723+
clang::TemplateSpecializationKind::TSK_Undeclared, true, false);
724+
}
719725
if (auto* CXXRD = llvm::dyn_cast_or_null<CXXRecordDecl>(D)) {
720726
if (CXXRD->hasDefinition())
721727
return CXXRD->getNumBases();

unittests/CppInterOp/ScopeReflectionTest.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,13 @@ TEST(ScopeReflectionTest, GetNumBases) {
641641
class D : public B, public C {};
642642
class E : public D {};
643643
class NoDef;
644+
645+
template<typename T, int N>
646+
struct Klass : public A {
647+
T t{N};
648+
};
649+
650+
typedef Klass<int, 1> TKlass;
644651
)";
645652

646653
GetAllTopLevelDecls(code, Decls);
@@ -653,6 +660,7 @@ TEST(ScopeReflectionTest, GetNumBases) {
653660
// FIXME: Perhaps we should have a special number or error out as this
654661
// operation is not well defined if a class has no definition.
655662
EXPECT_EQ(Cpp::GetNumBases(Decls[5]), 0);
663+
EXPECT_EQ(Cpp::GetNumBases(Cpp::GetUnderlyingScope(Decls[7])), 1);
656664
}
657665

658666
TEST(ScopeReflectionTest, GetBaseClass) {

0 commit comments

Comments
 (0)