diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -230,6 +230,11 @@ antecipation of `CWG2563 _`. - Fix highlighting issue with ``_Complex`` and initialization list with more than 2 items. (`#61518 `_) +- Fix ``getSourceRange`` on ``VarTemplateSpecializationDecl`` and + ``VarTemplatePartialSpecializationDecl``, which represents variable with + the initializer, so it behaves consistently with other ``VarDecls`` and ends + on the last token of initializer, instead of right angle bracket of + the template argument list. Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h --- a/clang/include/clang/AST/DeclTemplate.h +++ b/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(), diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -1402,6 +1402,15 @@ ASTTemplateArgumentListInfo::Create(getASTContext(), ArgsInfo); } +SourceRange VarTemplateSpecializationDecl::getSourceRange() const { + if (isExplicitSpecialization() && !hasInit()) { + if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsInfo()) + return SourceRange(getOuterLocStart(), Info->getRAngleLoc()); + } + return VarDecl::getSourceRange(); +} + + //===----------------------------------------------------------------------===// // VarTemplatePartialSpecializationDecl Implementation //===----------------------------------------------------------------------===// @@ -1447,6 +1456,14 @@ return new (C, ID) VarTemplatePartialSpecializationDecl(C); } +SourceRange VarTemplatePartialSpecializationDecl::getSourceRange() const { + if (isExplicitSpecialization() && !hasInit()) { + if (const ASTTemplateArgumentListInfo *Info = getTemplateArgsAsWritten()) + return SourceRange(getOuterLocStart(), Info->getRAngleLoc()); + } + return VarDecl::getSourceRange(); +} + static TemplateParameterList * createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC) { // typename T diff --git a/clang/test/AST/ast-dump-template-decls.cpp b/clang/test/AST/ast-dump-template-decls.cpp --- a/clang/test/AST/ast-dump-template-decls.cpp +++ b/clang/test/AST/ast-dump-template-decls.cpp @@ -197,9 +197,7 @@ template<> float unTempl = 1; -// FIXME (#61680) - serializing and loading AST should not affect reported source range -// DIRECT: VarTemplateSpecializationDecl 0x{{[^ ]*}} col:7 unTempl 'float' cinit -// SERIALIZED: VarTemplateSpecializationDecl 0x{{[^ ]*}} col:7 unTempl 'float' cinit +// CHECK: VarTemplateSpecializationDecl 0x{{[^ ]*}} col:7 unTempl 'float' cinit // CHECK-NEXT: |-TemplateArgument type 'float' // CHECK-NEXT: | `-BuiltinType 0x{{[^ ]*}} 'float' // CHECK-NEXT: `-ImplicitCastExpr 0x{{[^ ]*}} 'float' @@ -245,9 +243,7 @@ template<> float binTempl = 1; -// FIXME (#61680) - serializing and loading AST should not affect reported source range -// DIRECT: VarTemplateSpecializationDecl 0x{{[^ ]*}} col:7 binTempl 'float' cinit -// SERIALIZED: VarTemplateSpecializationDecl 0x{{[^ ]*}} col:7 binTempl 'float' cinit +// CHECK: VarTemplateSpecializationDecl 0x{{[^ ]*}} col:7 binTempl 'float' cinit // CHECK-NEXT: |-TemplateArgument type 'float' // CHECK-NEXT: | `-BuiltinType 0x{{[^ ]*}} 'float' // CHECK-NEXT: |-TemplateArgument type 'float'