@@ -978,7 +978,14 @@ static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::ASTContex
978
978
return GetCXXRecordDeclFromTemplateName (TST->getTemplateName ());
979
979
else if (auto Injected = Ty->getAs <clang::InjectedClassNameType>())
980
980
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
+ }
981
987
988
+ Ty->dump ();
982
989
assertml (0 , " Could not get base CXX record from type. Unhandled type: " , context.getSourceManager (), base.getBeginLoc ());
983
990
984
991
return nullptr ;
@@ -2714,41 +2721,59 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
2714
2721
auto TST = new TemplateSpecializationType ();
2715
2722
2716
2723
TemplateName Name = TS->getTemplateName ();
2717
- TST->_template = static_cast <Template*>(WalkDeclaration (
2718
- Name. getAsTemplateDecl ()));
2724
+ TST->_template = static_cast <Template*>(WalkDeclaration (Name. getAsTemplateDecl ()));
2725
+
2719
2726
if (TS->isSugared ())
2720
2727
TST->desugared = GetQualifiedType (TS->getCanonicalTypeInternal (), TL);
2721
2728
2722
- TypeLoc UTL, ETL, ITL ;
2729
+ TemplateArgumentList TArgs (TemplateArgumentList::OnStack, TS-> template_arguments ()) ;
2723
2730
2724
- if (LocValid)
2731
+ if (! LocValid)
2725
2732
{
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 ;
2740
2736
}
2741
2737
2742
- TemplateSpecializationTypeLoc TSpecTL;
2743
- TemplateSpecializationTypeLoc *TSTL = 0 ;
2744
- if (LocValid)
2738
+ TypeLoc UTL, ETL, ITL;
2739
+ if (TL->getTypeLocClass () == TypeLoc::Qualified)
2745
2740
{
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;
2748
2750
}
2749
2751
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
+ }
2752
2777
2753
2778
Ty = TST;
2754
2779
break ;
@@ -2760,38 +2785,52 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
2760
2785
2761
2786
if (TS->isSugared ())
2762
2787
TST->desugared = GetQualifiedType (TS->getCanonicalTypeInternal (), TL);
2788
+
2789
+ TemplateArgumentList TArgs (TemplateArgumentList::OnStack, TS->template_arguments ());
2763
2790
2764
- TypeLoc UTL, ETL, ITL;
2765
-
2766
- if (LocValid)
2791
+ if (!LocValid)
2767
2792
{
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 ;
2783
2796
}
2784
2797
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)
2788
2806
{
2789
- TSpecTL = TL->getAs <DependentTemplateSpecializationTypeLoc>();
2790
- TSTL = &TSpecTL;
2807
+ ETL = TL->getAs <ElaboratedTypeLoc>();
2808
+ ITL = ETL.getNextTypeLoc ();
2809
+ TL = &ITL;
2791
2810
}
2792
2811
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
+ }
2795
2834
2796
2835
Ty = TST;
2797
2836
break ;
0 commit comments