[clang] [Clang][AST] Fix ExplicitInstantiationDecl accessors for variable templates with tag types (PR #197856)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Tue May 19 05:19:45 PDT 2026
================
@@ -1842,67 +1843,64 @@ ExplicitInstantiationDecl::CreateDeserialized(ASTContext &C, GlobalDeclID ID,
}
SourceLocation ExplicitInstantiationDecl::getTagKWLoc() const {
- if (auto *TSI = getRawTypeSourceInfo()) {
- if (auto TL = TSI->getTypeLoc().getAs<TemplateSpecializationTypeLoc>())
- return TL.getElaboratedKeywordLoc();
- if (auto TL = TSI->getTypeLoc().getAs<TagTypeLoc>())
- return TL.getElaboratedKeywordLoc();
+ if (auto TL = getClassTypeLoc()) {
+ if (auto TST = TL->getAs<TemplateSpecializationTypeLoc>())
+ return TST.getElaboratedKeywordLoc();
+ if (auto Tag = TL->getAs<TagTypeLoc>())
+ return Tag.getElaboratedKeywordLoc();
}
return SourceLocation();
}
NestedNameSpecifierLoc ExplicitInstantiationDecl::getQualifierLoc() const {
if (hasTrailingQualifier())
return *getTrailingObjects<NestedNameSpecifierLoc>();
- if (auto *TSI = getRawTypeSourceInfo())
- return TSI->getTypeLoc().getPrefix();
+ if (auto TL = getClassTypeLoc())
+ return TL->getPrefix();
return NestedNameSpecifierLoc();
}
TypeSourceInfo *ExplicitInstantiationDecl::getTypeAsWritten() const {
- auto *TSI = getRawTypeSourceInfo();
- if (!TSI)
+ // For class-like entities, TSI encodes the class itself, not a declared type.
+ if (getClassTypeLoc())
return nullptr;
- TypeLoc TL = TSI->getTypeLoc();
- // For class templates and nested classes, the "type" is fully described by
- // the unified accessors (getQualifierLoc, getTemplateArg, getTagKWLoc).
- if (TL.getAs<TemplateSpecializationTypeLoc>() || TL.getAs<TagTypeLoc>())
- return nullptr;
- return TSI;
+ return getRawTypeSourceInfo();
}
unsigned ExplicitInstantiationDecl::getNumTemplateArgs() const {
if (const auto *Args = getTrailingArgsInfo())
return Args->NumTemplateArgs;
- if (auto *TSI = getRawTypeSourceInfo())
- if (auto TL = TSI->getTypeLoc().getAs<TemplateSpecializationTypeLoc>())
- return TL.getNumArgs();
+ if (auto TL = getClassTypeLoc())
+ if (auto TST = TL->getAs<TemplateSpecializationTypeLoc>())
+ return TST.getNumArgs();
return 0;
}
TemplateArgumentLoc
ExplicitInstantiationDecl::getTemplateArg(unsigned I) const {
if (const auto *Args = getTrailingArgsInfo())
return (*Args)[I];
- auto *TSI = getRawTypeSourceInfo();
- return TSI->getTypeLoc().castAs<TemplateSpecializationTypeLoc>().getArgLoc(I);
+ if (auto TL = getClassTypeLoc())
+ if (auto TST = TL->getAs<TemplateSpecializationTypeLoc>())
+ return TST.getArgLoc(I);
+ llvm_unreachable("template arguments not found in trailing args or TypeLoc");
}
SourceLocation ExplicitInstantiationDecl::getTemplateArgsLAngleLoc() const {
if (const auto *Args = getTrailingArgsInfo())
return Args->getLAngleLoc();
- if (auto *TSI = getRawTypeSourceInfo())
- if (auto TL = TSI->getTypeLoc().getAs<TemplateSpecializationTypeLoc>())
- return TL.getLAngleLoc();
+ if (auto TL = getClassTypeLoc())
+ if (auto TST = TL->getAs<TemplateSpecializationTypeLoc>())
+ return TST.getLAngleLoc();
return SourceLocation();
}
SourceLocation ExplicitInstantiationDecl::getTemplateArgsRAngleLoc() const {
if (const auto *Args = getTrailingArgsInfo())
return Args->getRAngleLoc();
- if (auto *TSI = getRawTypeSourceInfo())
- if (auto TL = TSI->getTypeLoc().getAs<TemplateSpecializationTypeLoc>())
- return TL.getRAngleLoc();
+ if (auto TL = getClassTypeLoc())
+ if (auto TST = TL->getAs<TemplateSpecializationTypeLoc>())
+ return TST.getRAngleLoc();
return SourceLocation();
----------------
mizvekov wrote:
Ditto.
https://github.com/llvm/llvm-project/pull/197856
More information about the cfe-commits
mailing list