Skip to content

Commit 7c7faab

Browse files
committed
Fix crashes in debug builds causing CI to fail
Implementation is based on mono#1819.
1 parent 690ada2 commit 7c7faab

File tree

1 file changed

+89
-50
lines changed

1 file changed

+89
-50
lines changed

src/CppParser/Parser.cpp

+89-50
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)