Skip to content

Commit dfa5179

Browse files
committed
[FOLD] return most recent declaration of primary
1 parent 51f84ce commit dfa5179

File tree

4 files changed

+29
-20
lines changed

4 files changed

+29
-20
lines changed

clang/include/clang/AST/DeclTemplate.h

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,13 +1955,7 @@ class ClassTemplateSpecializationDecl : public CXXRecordDecl,
19551955
/// specialization which was specialized by this.
19561956
llvm::PointerUnion<ClassTemplateDecl *,
19571957
ClassTemplatePartialSpecializationDecl *>
1958-
getSpecializedTemplateOrPartial() const {
1959-
if (const auto *PartialSpec =
1960-
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1961-
return PartialSpec->PartialSpecialization;
1962-
1963-
return SpecializedTemplate.get<ClassTemplateDecl*>();
1964-
}
1958+
getSpecializedTemplateOrPartial() const;
19651959

19661960
/// Retrieve the set of template arguments that should be used
19671961
/// to instantiate members of the class template or class template partial
@@ -2713,13 +2707,7 @@ class VarTemplateSpecializationDecl : public VarDecl,
27132707
/// Retrieve the variable template or variable template partial
27142708
/// specialization which was specialized by this.
27152709
llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
2716-
getSpecializedTemplateOrPartial() const {
2717-
if (const auto *PartialSpec =
2718-
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
2719-
return PartialSpec->PartialSpecialization;
2720-
2721-
return SpecializedTemplate.get<VarTemplateDecl *>();
2722-
}
2710+
getSpecializedTemplateOrPartial() const;
27232711

27242712
/// Retrieve the set of template arguments that should be used
27252713
/// to instantiate the initializer of the variable template or variable

clang/lib/AST/Decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4159,7 +4159,7 @@ FunctionTemplateDecl *FunctionDecl::getPrimaryTemplate() const {
41594159
if (FunctionTemplateSpecializationInfo *Info
41604160
= TemplateOrSpecialization
41614161
.dyn_cast<FunctionTemplateSpecializationInfo*>()) {
4162-
return Info->getTemplate();
4162+
return Info->getTemplate()->getMostRecentDecl();
41634163
}
41644164
return nullptr;
41654165
}

clang/lib/AST/DeclTemplate.cpp

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -997,12 +997,23 @@ void ClassTemplateSpecializationDecl::getNameForDiagnostic(
997997
}
998998
}
999999

1000+
llvm::PointerUnion<ClassTemplateDecl *,
1001+
ClassTemplatePartialSpecializationDecl *>
1002+
ClassTemplateSpecializationDecl::getSpecializedTemplateOrPartial() const {
1003+
if (const auto *PartialSpec =
1004+
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1005+
return PartialSpec->PartialSpecialization->getMostRecentDecl();
1006+
1007+
return SpecializedTemplate.get<ClassTemplateDecl *>()->getMostRecentDecl();
1008+
}
1009+
10001010
ClassTemplateDecl *
10011011
ClassTemplateSpecializationDecl::getSpecializedTemplate() const {
10021012
if (const auto *PartialSpec =
10031013
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
1004-
return PartialSpec->PartialSpecialization->getSpecializedTemplate();
1005-
return SpecializedTemplate.get<ClassTemplateDecl*>();
1014+
return PartialSpec->PartialSpecialization->getSpecializedTemplate()
1015+
->getMostRecentDecl();
1016+
return SpecializedTemplate.get<ClassTemplateDecl *>()->getMostRecentDecl();
10061017
}
10071018

10081019
SourceRange
@@ -1410,11 +1421,21 @@ void VarTemplateSpecializationDecl::getNameForDiagnostic(
14101421
}
14111422
}
14121423

1424+
llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
1425+
VarTemplateSpecializationDecl::getSpecializedTemplateOrPartial() const {
1426+
if (const auto *PartialSpec =
1427+
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1428+
return PartialSpec->PartialSpecialization->getMostRecentDecl();
1429+
1430+
return SpecializedTemplate.get<VarTemplateDecl *>()->getMostRecentDecl();
1431+
}
1432+
14131433
VarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const {
14141434
if (const auto *PartialSpec =
14151435
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1416-
return PartialSpec->PartialSpecialization->getSpecializedTemplate();
1417-
return SpecializedTemplate.get<VarTemplateDecl *>();
1436+
return PartialSpec->PartialSpecialization->getSpecializedTemplate()
1437+
->getMostRecentDecl();
1438+
return SpecializedTemplate.get<VarTemplateDecl *>()->getMostRecentDecl();
14181439
}
14191440

14201441
SourceRange VarTemplateSpecializationDecl::getSourceRange() const {

clang/test/AST/ast-dump-decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ namespace testCanonicalTemplate {
530530
// CHECK-NEXT: | `-ClassTemplateDecl 0x{{.+}} parent 0x{{.+}} <col:5, col:40> col:40 friend_undeclared TestClassTemplate{{$}}
531531
// CHECK-NEXT: | |-TemplateTypeParmDecl 0x{{.+}} <col:14, col:23> col:23 typename depth 1 index 0 T2{{$}}
532532
// CHECK-NEXT: | `-CXXRecordDecl 0x{{.+}} parent 0x{{.+}} <col:34, col:40> col:40 class TestClassTemplate{{$}}
533-
// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <line:[[@LINE-19]]:3, line:[[@LINE-17]]:3> line:[[@LINE-19]]:31 class TestClassTemplate definition implicit_instantiation{{$}}
533+
// CHECK-NEXT: `-ClassTemplateSpecializationDecl 0x{{.+}} <col:5, col:40> line:[[@LINE-19]]:31 class TestClassTemplate definition implicit_instantiation{{$}}
534534
// CHECK-NEXT: |-DefinitionData pass_in_registers empty aggregate standard_layout trivially_copyable pod trivial literal has_constexpr_non_copy_move_ctor can_const_default_init{{$}}
535535
// CHECK-NEXT: | |-DefaultConstructor exists trivial constexpr defaulted_is_constexpr{{$}}
536536
// CHECK-NEXT: | |-CopyConstructor simple trivial has_const_param implicit_has_const_param{{$}}

0 commit comments

Comments
 (0)