Browse Source

Parser.cpp: fix WalkType for clang::Type::TypeClass == clang::Type::TemplateSpecialization

pull/1819/head
Deadlocklogic 3 years ago
parent
commit
4b6b3ca471
  1. 29
      src/CppParser/Parser.cpp

29
src/CppParser/Parser.cpp

@ -2638,10 +2638,11 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
if (TS->isSugared()) if (TS->isSugared())
TST->desugared = GetQualifiedType(TS->getCanonicalTypeInternal(), TL); TST->desugared = GetQualifiedType(TS->getCanonicalTypeInternal(), TL);
TypeLoc UTL, ETL, ITL; TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->template_arguments());
if (LocValid) if (LocValid)
{ {
TypeLoc UTL, ETL, ITL;
auto TypeLocClass = TL->getTypeLocClass(); auto TypeLocClass = TL->getTypeLocClass();
if (TypeLocClass == TypeLoc::Qualified) if (TypeLocClass == TypeLoc::Qualified)
{ {
@ -2655,20 +2656,26 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
TL = &ITL; TL = &ITL;
} }
assert(TL->getTypeLocClass() == TypeLoc::TemplateSpecialization); if (TL->getTypeLocClass() == TypeLoc::DependentTemplateSpecialization)
{
DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs<DependentTemplateSpecializationTypeLoc>();
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
}
else if (TL->getTypeLocClass() == TypeLoc::TemplateSpecialization)
{
TemplateSpecializationTypeLoc TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL);
}
else
{
llvm_unreachable("Unexpected semantics");
}
} }
else
TemplateSpecializationTypeLoc TSpecTL;
TemplateSpecializationTypeLoc *TSTL = 0;
if (LocValid)
{ {
TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>(); TST->Arguments = WalkTemplateArgumentList(&TArgs, (TemplateSpecializationTypeLoc*)nullptr);
TSTL = &TSpecTL;
} }
TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->template_arguments());
TST->Arguments = WalkTemplateArgumentList(&TArgs, TSTL);
Ty = TST; Ty = TST;
break; break;
} }

Loading…
Cancel
Save