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