[clang] Store the template param list of an explicit variable template specialization

VarTemplateSpecializationDecl does not store a template param list,
so the "template<>" needs to be stored in the ExtInfo.

Differential Revision: https://reviews.llvm.org/D142692
This commit is contained in:
Nathan Ridge 2023-01-27 02:17:20 -05:00
parent e9a88b6178
commit 6b50bfc8f2
2 changed files with 8 additions and 3 deletions

View File

@ -892,7 +892,7 @@ sizeof...($TemplateParameter[[Elements]]);
template $Bracket[[<]]typename $TemplateParameter_def[[T]]$Bracket[[>]]
$TemplateParameter[[T]] $Variable_def[[x]] = {};
template <>
template $Bracket[[<]]$Bracket[[>]]
int $Variable_def[[x]]$Bracket[[<]]int$Bracket[[>]] = (int)sizeof($Class[[Base]]);
)cpp",
// operator calls in template
@ -977,7 +977,7 @@ $Bracket[[>]]$Bracket[[>]] $LocalVariable_def[[s6]];
}
template $Bracket[[<]]typename $TemplateParameter_def[[T]]$Bracket[[>]] constexpr int $Variable_def_readonly[[V]] = 42;
constexpr int $Variable_def_readonly[[Y]] = $Variable_readonly[[V]]$Bracket[[<]]char$Bracket[[>]];
template <>
template $Bracket[[<]]$Bracket[[>]]
constexpr int $Variable_def_readonly[[V]]$Bracket[[<]]int$Bracket[[>]] = 5;
template $Bracket[[<]]typename $TemplateParameter_def[[T]]$Bracket[[>]]
constexpr int $Variable_def_readonly[[V]]$Bracket[[<]]$TemplateParameter[[T]]*$Bracket[[>]] = 6;

View File

@ -7674,7 +7674,12 @@ NamedDecl *Sema::ActOnVariableDeclarator(
// If we have any template parameter lists that don't directly belong to
// the variable (matching the scope specifier), store them.
unsigned VDTemplateParamLists = TemplateParams ? 1 : 0;
// An explicit variable template specialization does not own any template
// parameter lists.
bool IsExplicitSpecialization =
IsVariableTemplateSpecialization && !IsPartialSpecialization;
unsigned VDTemplateParamLists =
(TemplateParams && !IsExplicitSpecialization) ? 1 : 0;
if (TemplateParamLists.size() > VDTemplateParamLists)
NewVD->setTemplateParameterListsInfo(
Context, TemplateParamLists.drop_back(VDTemplateParamLists));