From 4b6b3ca4719736a101b19e64e9bc9e8f6275da62 Mon Sep 17 00:00:00 2001 From: Deadlocklogic Date: Mon, 1 Jan 2024 03:46:50 +0200 Subject: [PATCH] Parser.cpp: fix WalkType for clang::Type::TypeClass == clang::Type::TemplateSpecialization --- src/CppParser/Parser.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index b12e991c..379a1b8c 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -2638,10 +2638,11 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL, if (TS->isSugared()) TST->desugared = GetQualifiedType(TS->getCanonicalTypeInternal(), TL); - TypeLoc UTL, ETL, ITL; + TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->template_arguments()); if (LocValid) { + TypeLoc UTL, ETL, ITL; auto TypeLocClass = TL->getTypeLocClass(); if (TypeLocClass == TypeLoc::Qualified) { @@ -2655,20 +2656,26 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL, TL = &ITL; } - assert(TL->getTypeLocClass() == TypeLoc::TemplateSpecialization); + if (TL->getTypeLocClass() == TypeLoc::DependentTemplateSpecialization) + { + DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs(); + TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL); + } + else if (TL->getTypeLocClass() == TypeLoc::TemplateSpecialization) + { + TemplateSpecializationTypeLoc TSpecTL = TL->getAs(); + TST->Arguments = WalkTemplateArgumentList(&TArgs, &TSpecTL); + } + else + { + llvm_unreachable("Unexpected semantics"); + } } - - TemplateSpecializationTypeLoc TSpecTL; - TemplateSpecializationTypeLoc *TSTL = 0; - if (LocValid) + else { - TSpecTL = TL->getAs(); - TSTL = &TSpecTL; + TST->Arguments = WalkTemplateArgumentList(&TArgs, (TemplateSpecializationTypeLoc*)nullptr); } - TemplateArgumentList TArgs(TemplateArgumentList::OnStack, TS->template_arguments()); - TST->Arguments = WalkTemplateArgumentList(&TArgs, TSTL); - Ty = TST; break; }