Skip to content

Commit 4b6b3ca

Browse files
committed
Parser.cpp: fix WalkType for clang::Type::TypeClass == clang::Type::TemplateSpecialization
1 parent 7b0375d commit 4b6b3ca

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

src/CppParser/Parser.cpp

+18-11
Original file line numberDiff line numberDiff line change
@@ -2638,10 +2638,11 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
26382638
if (TS->isSugared())
26392639
TST->desugared = GetQualifiedType(TS->getCanonicalTypeInternal(), TL);
26402640

2641-
TypeLoc UTL, ETL, ITL;
2641+
TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->template_arguments());
26422642

26432643
if (LocValid)
26442644
{
2645+
TypeLoc UTL, ETL, ITL;
26452646
auto TypeLocClass = TL->getTypeLocClass();
26462647
if (TypeLocClass == TypeLoc::Qualified)
26472648
{
@@ -2655,20 +2656,26 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
26552656
TL = &ITL;
26562657
}
26572658

2658-
assert(TL->getTypeLocClass() == TypeLoc::TemplateSpecialization);
2659+
if (TL->getTypeLocClass() == TypeLoc::DependentTemplateSpecialization)
2660+
{
2661+
DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs<DependentTemplateSpecializationTypeLoc>();
2662+
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
2663+
}
2664+
else if (TL->getTypeLocClass() == TypeLoc::TemplateSpecialization)
2665+
{
2666+
TemplateSpecializationTypeLoc TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
2667+
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
2668+
}
2669+
else
2670+
{
2671+
llvm_unreachable("Unexpected semantics");
2672+
}
26592673
}
2660-
2661-
TemplateSpecializationTypeLoc TSpecTL;
2662-
TemplateSpecializationTypeLoc *TSTL = 0;
2663-
if (LocValid)
2674+
else
26642675
{
2665-
TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
2666-
TSTL = &TSpecTL;
2676+
TST->Arguments = WalkTemplateArgumentList(&TArgs, (TemplateSpecializationTypeLoc*)nullptr);
26672677
}
26682678

2669-
TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->template_arguments());
2670-
TST->Arguments = WalkTemplateArgumentList(&TArgs, TSTL);
2671-
26722679
Ty = TST;
26732680
break;
26742681
}

0 commit comments

Comments
 (0)