@@ -978,7 +978,14 @@ static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::ASTContex
978978 return GetCXXRecordDeclFromTemplateName (TST->getTemplateName ());
979979 else if (auto Injected = Ty->getAs <clang::InjectedClassNameType>())
980980 return Injected->getDecl ();
981+ else if (auto TTPT = Ty->getAs <clang::TemplateTypeParmType>()) {
982+ return nullptr ;
983+ }
984+ else if (auto DNT = Ty->getAs <clang::DependentNameType>()) {
985+ return nullptr ;
986+ }
981987
988+ Ty->dump ();
982989 assertml (0 , " Could not get base CXX record from type. Unhandled type: " , context.getSourceManager (), base.getBeginLoc ());
983990
984991 return nullptr ;
@@ -2714,41 +2721,59 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
27142721 auto TST = new TemplateSpecializationType ();
27152722
27162723 TemplateName Name = TS->getTemplateName ();
2717- TST->_template = static_cast <Template*>(WalkDeclaration (
2718- Name. getAsTemplateDecl ()));
2724+ TST->_template = static_cast <Template*>(WalkDeclaration (Name. getAsTemplateDecl ()));
2725+
27192726 if (TS->isSugared ())
27202727 TST->desugared = GetQualifiedType (TS->getCanonicalTypeInternal (), TL);
27212728
2722- TypeLoc UTL, ETL, ITL ;
2729+ TemplateArgumentList TArgs (TemplateArgumentList::OnStack, TS-> template_arguments ()) ;
27232730
2724- if (LocValid)
2731+ if (! LocValid)
27252732 {
2726- auto TypeLocClass = TL->getTypeLocClass ();
2727- if (TypeLocClass == TypeLoc::Qualified)
2728- {
2729- UTL = TL->getUnqualifiedLoc ();
2730- TL = &UTL;
2731- }
2732- else if (TypeLocClass == TypeLoc::Elaborated)
2733- {
2734- ETL = TL->getAs <ElaboratedTypeLoc>();
2735- ITL = ETL.getNextTypeLoc ();
2736- TL = &ITL;
2737- }
2738-
2739- assertm (TL->getTypeLocClass () == TypeLoc::TemplateSpecialization, " Only Template specialization accepted!\n " );
2733+ TST->Arguments = WalkTemplateArgumentList (&TArgs, (TemplateSpecializationTypeLoc*)nullptr );
2734+ Ty = TST;
2735+ break ;
27402736 }
27412737
2742- TemplateSpecializationTypeLoc TSpecTL;
2743- TemplateSpecializationTypeLoc *TSTL = 0 ;
2744- if (LocValid)
2738+ TypeLoc UTL, ETL, ITL;
2739+ if (TL->getTypeLocClass () == TypeLoc::Qualified)
27452740 {
2746- TSpecTL = TL->getAs <TemplateSpecializationTypeLoc>();
2747- TSTL = &TSpecTL;
2741+ UTL = TL->getUnqualifiedLoc ();
2742+ TL = &UTL;
2743+ }
2744+
2745+ if (TL->getTypeLocClass () == TypeLoc::Elaborated)
2746+ {
2747+ ETL = TL->getAs <ElaboratedTypeLoc>();
2748+ ITL = ETL.getNextTypeLoc ();
2749+ TL = &ITL;
27482750 }
27492751
2750- TemplateArgumentList TArgs (TemplateArgumentList::OnStack, TS->template_arguments ());
2751- TST->Arguments = WalkTemplateArgumentList (&TArgs, TSTL);
2752+ switch (TL->getTypeLocClass ()) {
2753+ case TypeLoc::DependentTemplateSpecialization:
2754+ {
2755+ DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs <DependentTemplateSpecializationTypeLoc>();
2756+ TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
2757+ Ty = TST;
2758+ break ;
2759+ }
2760+ case TypeLoc::TemplateSpecialization:
2761+ {
2762+ TemplateSpecializationTypeLoc TSpecTL = TL->getAs <TemplateSpecializationTypeLoc>();
2763+ TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
2764+ Ty = TST;
2765+ break ;
2766+ }
2767+ case TypeLoc::TemplateTypeParm:
2768+ {
2769+ TemplateTypeParmTypeLoc TTPTL = TL->getAs <TemplateTypeParmTypeLoc>();
2770+ TST->Arguments = WalkTemplateArgumentList (&TArgs, (TemplateSpecializationTypeLoc*)nullptr );
2771+ break ;
2772+ }
2773+ default :
2774+ assertml (0 , " Unhandled TemplateSpecializationTypeLoc!\n " , c->getSourceManager (), TL->getBeginLoc ());
2775+ break ;
2776+ }
27522777
27532778 Ty = TST;
27542779 break ;
@@ -2760,38 +2785,52 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
27602785
27612786 if (TS->isSugared ())
27622787 TST->desugared = GetQualifiedType (TS->getCanonicalTypeInternal (), TL);
2788+
2789+ TemplateArgumentList TArgs (TemplateArgumentList::OnStack, TS->template_arguments ());
27632790
2764- TypeLoc UTL, ETL, ITL;
2765-
2766- if (LocValid)
2791+ if (!LocValid)
27672792 {
2768- auto TypeLocClass = TL->getTypeLocClass ();
2769- if (TypeLocClass == TypeLoc::Qualified)
2770- {
2771- UTL = TL->getUnqualifiedLoc ();
2772- TL = &UTL;
2773- }
2774- else if (TypeLocClass == TypeLoc::Elaborated)
2775- {
2776- ETL = TL->getAs <ElaboratedTypeLoc>();
2777- ITL = ETL.getNextTypeLoc ();
2778- TL = &ITL;
2779- }
2780- assertml (TL->getTypeLocClass () == TypeLoc::DependentTemplateSpecialization,
2781- " Dependent template only accepted!" ,
2782- c->getSourceManager (), TL->getBeginLoc ());
2793+ TST->Arguments = WalkTemplateArgumentList (&TArgs, (DependentTemplateSpecializationTypeLoc*)nullptr );
2794+ Ty = TST;
2795+ break ;
27832796 }
27842797
2785- DependentTemplateSpecializationTypeLoc TSpecTL;
2786- DependentTemplateSpecializationTypeLoc *TSTL = 0 ;
2787- if (LocValid)
2798+ TypeLoc UTL, ETL, ITL;
2799+ if (TL->getTypeLocClass () == TypeLoc::Qualified)
2800+ {
2801+ UTL = TL->getUnqualifiedLoc ();
2802+ TL = &UTL;
2803+ }
2804+
2805+ if (TL->getTypeLocClass () == TypeLoc::Elaborated)
27882806 {
2789- TSpecTL = TL->getAs <DependentTemplateSpecializationTypeLoc>();
2790- TSTL = &TSpecTL;
2807+ ETL = TL->getAs <ElaboratedTypeLoc>();
2808+ ITL = ETL.getNextTypeLoc ();
2809+ TL = &ITL;
27912810 }
27922811
2793- TemplateArgumentList TArgs (TemplateArgumentList::OnStack, TS->template_arguments ());
2794- TST->Arguments = WalkTemplateArgumentList (&TArgs, TSTL);
2812+ switch (TL->getTypeLocClass ()) {
2813+ case TypeLoc::DependentTemplateSpecialization:
2814+ {
2815+ DependentTemplateSpecializationTypeLoc TSpecTL = TL->getAs <DependentTemplateSpecializationTypeLoc>();
2816+ TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
2817+ break ;
2818+ }
2819+ case TypeLoc::TemplateSpecialization:
2820+ {
2821+ TemplateSpecializationTypeLoc TSpecTL = TL->getAs <TemplateSpecializationTypeLoc>();
2822+ TST->Arguments = WalkTemplateArgumentList (&TArgs, &TSpecTL);
2823+ break ;
2824+ }
2825+ case TypeLoc::TemplateTypeParm:
2826+ {
2827+ TST->Arguments = WalkTemplateArgumentList (&TArgs, (DependentTemplateSpecializationTypeLoc*)nullptr );
2828+ break ;
2829+ }
2830+ default :
2831+ assertml (0 , " Unhandled DependentTemplateSpecializationTypeLoc!\n " , c->getSourceManager (), TL->getBeginLoc ());
2832+ break ;
2833+ }
27952834
27962835 Ty = TST;
27972836 break ;
0 commit comments