@@ -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