@@ -2162,34 +2162,46 @@ static PrimitiveType WalkBuiltinType(const clang::BuiltinType* Builtin)
21622162
21632163// -----------------------------------//
21642164
2165- clang::TypeLoc ResolveTypeLoc (clang::TypeLoc TL, clang::TypeLoc::TypeLocClass Class )
2165+ clang::TypeLoc ResolveTypeLoc (clang::TypeLoc TL, bool isRecursive = true , const std::vector< clang::TypeLoc::TypeLocClass>& Classes = {} )
21662166{
21672167 using namespace clang ;
21682168
21692169 auto TypeLocClass = TL.getTypeLocClass ();
21702170
2171- if (TypeLocClass == Class )
2171+ if (std::find (Classes. begin (), Classes. end (), TypeLocClass) != Classes. end () )
21722172 {
21732173 return TL;
21742174 }
2175- if (TypeLocClass == TypeLoc::Qualified)
2175+ else if (TypeLocClass == TypeLoc::Qualified)
21762176 {
21772177 auto UTL = TL.getUnqualifiedLoc ();
21782178 TL = UTL;
2179+ if (isRecursive)
2180+ {
2181+ return ResolveTypeLoc (TL, isRecursive, Classes);
2182+ }
21792183 }
21802184 else if (TypeLocClass == TypeLoc::Elaborated)
21812185 {
21822186 auto ETL = TL.getAs <ElaboratedTypeLoc>();
21832187 auto ITL = ETL.getNextTypeLoc ();
21842188 TL = ITL;
2189+ if (isRecursive)
2190+ {
2191+ return ResolveTypeLoc (TL, isRecursive, Classes);
2192+ }
21852193 }
2186- else if (TypeLocClass == TypeLoc::Paren )
2194+ else if (!Classes. empty () )
21872195 {
2188- auto PTL = TL.getAs <ParenTypeLoc>();
2189- TL = PTL.getNextTypeLoc ();
2196+ auto ITL = TL.getNextTypeLoc ();
2197+ TL = ITL;
2198+ if (isRecursive)
2199+ {
2200+ return ResolveTypeLoc (TL, isRecursive, Classes);
2201+ }
21902202 }
21912203
2192- assert (TL.getTypeLocClass () == Class );
2204+ assert (Classes. empty () || std::find (Classes. begin (), Classes. end (), TL.getTypeLocClass ()) != Classes. end () );
21932205 return TL;
21942206}
21952207
@@ -2642,28 +2654,16 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
26422654
26432655 if (LocValid)
26442656 {
2645- TypeLoc UTL, ETL, ITL;
2646- auto TypeLocClass = TL->getTypeLocClass ();
2647- if (TypeLocClass == TypeLoc::Qualified)
2648- {
2649- UTL = TL->getUnqualifiedLoc ();
2650- TL = &UTL;
2651- }
2652- else if (TypeLocClass == TypeLoc::Elaborated)
2653- {
2654- ETL = TL->getAs <ElaboratedTypeLoc>();
2655- ITL = ETL.getNextTypeLoc ();
2656- TL = &ITL;
2657- }
2657+ TypeLoc resolvedTypeLoc = ResolveTypeLoc (*TL, true , { TypeLoc::TemplateSpecialization , TypeLoc::DependentTemplateSpecialization });
26582658
2659- if (TL-> getTypeLocClass () == TypeLoc::DependentTemplateSpecialization)
2659+ if (resolvedTypeLoc. getTypeLocClass () == TypeLoc::DependentTemplateSpecialization)
26602660 {
2661- DependentTemplateSpecializationTypeLoc TSpecTL = TL-> getAs <DependentTemplateSpecializationTypeLoc>();
2661+ DependentTemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc. getAs <DependentTemplateSpecializationTypeLoc>();
26622662 TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
26632663 }
2664- else if (TL-> getTypeLocClass () == TypeLoc::TemplateSpecialization)
2664+ else if (resolvedTypeLoc. getTypeLocClass () == TypeLoc::TemplateSpecialization)
26652665 {
2666- TemplateSpecializationTypeLoc TSpecTL = TL-> getAs <TemplateSpecializationTypeLoc>();
2666+ TemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc. getAs <TemplateSpecializationTypeLoc>();
26672667 TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
26682668 }
26692669 else
@@ -2691,28 +2691,16 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
26912691
26922692 if (LocValid)
26932693 {
2694- TypeLoc UTL, ETL, ITL;
2695- auto TypeLocClass = TL->getTypeLocClass ();
2696- if (TypeLocClass == TypeLoc::Qualified)
2697- {
2698- UTL = TL->getUnqualifiedLoc ();
2699- TL = &UTL;
2700- }
2701- else if (TypeLocClass == TypeLoc::Elaborated)
2702- {
2703- ETL = TL->getAs <ElaboratedTypeLoc>();
2704- ITL = ETL.getNextTypeLoc ();
2705- TL = &ITL;
2706- }
2694+ TypeLoc resolvedTypeLoc = ResolveTypeLoc (*TL, true , { TypeLoc::TemplateSpecialization , TypeLoc::DependentTemplateSpecialization });
27072695
2708- if (TL-> getTypeLocClass () == TypeLoc::DependentTemplateSpecialization)
2696+ if (resolvedTypeLoc. getTypeLocClass () == TypeLoc::DependentTemplateSpecialization)
27092697 {
2710- DependentTemplateSpecializationTypeLoc TSpecTL = TL-> getAs <DependentTemplateSpecializationTypeLoc>();
2698+ DependentTemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc. getAs <DependentTemplateSpecializationTypeLoc>();
27112699 TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
27122700 }
2713- else if (TL-> getTypeLocClass () == TypeLoc::TemplateSpecialization)
2701+ else if (resolvedTypeLoc. getTypeLocClass () == TypeLoc::TemplateSpecialization)
27142702 {
2715- TemplateSpecializationTypeLoc TSpecTL = TL-> getAs <TemplateSpecializationTypeLoc>();
2703+ TemplateSpecializationTypeLoc TSpecTL = resolvedTypeLoc. getAs <TemplateSpecializationTypeLoc>();
27162704 TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
27172705 }
27182706 else
@@ -2741,27 +2729,10 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
27412729
27422730 if (LocValid)
27432731 {
2744- auto TypeLocClass = TL->getTypeLocClass ();
2745- if (TypeLocClass == TypeLoc::Qualified)
2746- {
2747- UTL = TL->getUnqualifiedLoc ();
2748- TL = &UTL;
2749- }
2750- else if (TypeLocClass == TypeLoc::Elaborated)
2751- {
2752- ETL = TL->getAs <ElaboratedTypeLoc>();
2753- ITL = ETL.getNextTypeLoc ();
2754- TL = &ITL;
2755- }
2756-
2757- while (TL->getTypeLocClass () != TypeLoc::TemplateTypeParm)
2758- {
2759- Next = TL->getNextTypeLoc ();
2760- TL = &Next;
2761- }
2732+ TypeLoc resolvedTypeLoc = ResolveTypeLoc (*TL, true , { TypeLoc::TemplateTypeParm });
27622733
2763- assert (TL-> getTypeLocClass () == TypeLoc::TemplateTypeParm);
2764- auto TTTL = TL-> getAs <TemplateTypeParmTypeLoc>();
2734+ assert (resolvedTypeLoc. getTypeLocClass () == TypeLoc::TemplateTypeParm);
2735+ auto TTTL = resolvedTypeLoc. getAs <TemplateTypeParmTypeLoc>();
27652736
27662737 TPT->parameter = WalkTypeTemplateParameter (TTTL.getDecl ());
27672738 }
0 commit comments