[PATCH] D146733: [clang] source range of variable template specialization should include initializer
Tomasz KamiĆski via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 23 09:40:02 PDT 2023
tomasz-kaminski-sonarsource created this revision.
Herald added a project: All.
tomasz-kaminski-sonarsource requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
This patch adjust the getSourceRange() for the
VarTemplateSpecializationDecl and VarTemplatePartialSpecializationDecl,
such that the initializer is included if present:
template<typename T>
T temp = 1;
template<> double temp<double> = 1;
This patch makes it consistent with the behavior of
non-template variables with initializes and restores
behavior that was present before https://reviews.llvm.org/D13970.
w!In case, when the initializer is not present we still
include the template-arguments in the source range,
which was required for fixing zero-initialization fix-it.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D146733
Files:
clang/include/clang/AST/DeclTemplate.h
clang/lib/AST/DeclTemplate.cpp
Index: clang/lib/AST/DeclTemplate.cpp
===================================================================
--- clang/lib/AST/DeclTemplate.cpp
+++ clang/lib/AST/DeclTemplate.cpp
@@ -1402,6 +1402,22 @@
ASTTemplateArgumentListInfo::Create(getASTContext(), ArgsInfo);
}
+SourceRange VarTemplateSpecializationDecl::getSourceRange() const {
+ if (const Expr *Init = getInit()) {
+ SourceLocation InitEnd = Init->getEndLoc();
+ // If Init is implicit, ignore its source range and fallback on
+ // DeclaratorDecl::getSourceRange() to handle postfix elements.
+ if (InitEnd.isValid() && InitEnd != getLocation())
+ return SourceRange(getOuterLocStart(), InitEnd);
+ }
+ if (isExplicitSpecialization()) {
+ if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsInfo())
+ return SourceRange(getOuterLocStart(), Info->getRAngleLoc());
+ }
+ return VarDecl::getSourceRange();
+}
+
+
//===----------------------------------------------------------------------===//
// VarTemplatePartialSpecializationDecl Implementation
//===----------------------------------------------------------------------===//
@@ -1447,6 +1463,21 @@
return new (C, ID) VarTemplatePartialSpecializationDecl(C);
}
+SourceRange VarTemplatePartialSpecializationDecl::getSourceRange() const {
+ if (const Expr *Init = getInit()) {
+ SourceLocation InitEnd = Init->getEndLoc();
+ // If Init is implicit, ignore its source range and fallback on
+ // DeclaratorDecl::getSourceRange() to handle postfix elements.
+ if (InitEnd.isValid() && InitEnd != getLocation())
+ return SourceRange(getOuterLocStart(), InitEnd);
+ }
+ if (isExplicitSpecialization()) {
+ if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten())
+ return SourceRange(getOuterLocStart(), Info->getRAngleLoc());
+ }
+ return VarDecl::getSourceRange();
+}
+
static TemplateParameterList *
createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) {
// typename T
Index: clang/include/clang/AST/DeclTemplate.h
===================================================================
--- clang/include/clang/AST/DeclTemplate.h
+++ clang/include/clang/AST/DeclTemplate.h
@@ -2926,13 +2926,7 @@
return ExplicitInfo ? ExplicitInfo->TemplateKeywordLoc : SourceLocation();
}
- SourceRange getSourceRange() const override LLVM_READONLY {
- if (isExplicitSpecialization()) {
- if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsInfo())
- return SourceRange(getOuterLocStart(), Info->getRAngleLoc());
- }
- return VarDecl::getSourceRange();
- }
+ SourceRange getSourceRange() const override LLVM_READONLY;
void Profile(llvm::FoldingSetNodeID &ID) const {
Profile(ID, TemplateArgs->asArray(), getASTContext());
@@ -3091,13 +3085,7 @@
return First->InstantiatedFromMember.setInt(true);
}
- SourceRange getSourceRange() const override LLVM_READONLY {
- if (isExplicitSpecialization()) {
- if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten())
- return SourceRange(getOuterLocStart(), Info->getRAngleLoc());
- }
- return VarDecl::getSourceRange();
- }
+ SourceRange getSourceRange() const override LLVM_READONLY;
void Profile(llvm::FoldingSetNodeID &ID) const {
Profile(ID, getTemplateArgs().asArray(), getTemplateParameters(),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D146733.507770.patch
Type: text/x-patch
Size: 3366 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230323/fff39050/attachment-0001.bin>
More information about the cfe-commits
mailing list