Skip to content

Commit

Permalink
[NFC] Move isSameDefaultTemplateArgument into ASTContext
Browse files Browse the repository at this point in the history
Move isSameDefaultTemplateArgument into ASTContext to keep consistent
with other ASTContext:isSame* methods.
  • Loading branch information
ChuanqiXu9 committed Jul 8, 2022
1 parent 0266773 commit 8db8754
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 45 deletions.
5 changes: 5 additions & 0 deletions clang/include/clang/AST/ASTContext.h
Expand Up @@ -2664,6 +2664,11 @@ class ASTContext : public RefCountedBase<ASTContext> {
/// that they may be used in declarations of the same template.
bool isSameTemplateParameter(const NamedDecl *X, const NamedDecl *Y) const;

/// Determine whether two default template arguments are similar enough
/// that they may be used in declarations of the same template.
bool isSameDefaultTemplateArgument(const NamedDecl *X,
const NamedDecl *Y) const;

/// Retrieve the "canonical" template argument.
///
/// The canonical template argument is the simplest template argument
Expand Down
39 changes: 39 additions & 0 deletions clang/lib/AST/ASTContext.cpp
Expand Up @@ -6294,6 +6294,45 @@ bool ASTContext::isSameTemplateParameterList(
return true;
}

bool ASTContext::isSameDefaultTemplateArgument(const NamedDecl *X,
const NamedDecl *Y) const {
// If the type parameter isn't the same already, we don't need to check the
// default argument further.
if (!isSameTemplateParameter(X, Y))
return false;

if (auto *TTPX = dyn_cast<TemplateTypeParmDecl>(X)) {
auto *TTPY = cast<TemplateTypeParmDecl>(Y);
if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
return false;

return hasSameType(TTPX->getDefaultArgument(), TTPY->getDefaultArgument());
}

if (auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(X)) {
auto *NTTPY = cast<NonTypeTemplateParmDecl>(Y);
if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
return false;

Expr *DefaultArgumentX = NTTPX->getDefaultArgument()->IgnoreImpCasts();
Expr *DefaultArgumentY = NTTPY->getDefaultArgument()->IgnoreImpCasts();
llvm::FoldingSetNodeID XID, YID;
DefaultArgumentX->Profile(XID, *this, /*Canonical=*/true);
DefaultArgumentY->Profile(YID, *this, /*Canonical=*/true);
return XID == YID;
}

auto *TTPX = cast<TemplateTemplateParmDecl>(X);
auto *TTPY = cast<TemplateTemplateParmDecl>(Y);

if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
return false;

const TemplateArgument &TAX = TTPX->getDefaultArgument().getArgument();
const TemplateArgument &TAY = TTPY->getDefaultArgument().getArgument();
return hasSameTemplateName(TAX.getAsTemplate(), TAY.getAsTemplate());
}

static NamespaceDecl *getNamespace(const NestedNameSpecifier *X) {
if (auto *NS = X->getAsNamespace())
return NS;
Expand Down
51 changes: 6 additions & 45 deletions clang/lib/Sema/SemaTemplate.cpp
Expand Up @@ -2643,46 +2643,6 @@ static bool DiagnoseUnexpandedParameterPacks(Sema &S,
return false;
}

static bool hasSameDefaultTemplateArgument(NamedDecl *X, NamedDecl *Y) {
ASTContext &C = X->getASTContext();
// If the type parameter isn't the same already, we don't need to check the
// default argument further.
if (!C.isSameTemplateParameter(X, Y))
return false;

if (auto *TTPX = dyn_cast<TemplateTypeParmDecl>(X)) {
auto *TTPY = cast<TemplateTypeParmDecl>(Y);
if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
return false;

return C.hasSameType(TTPX->getDefaultArgument(),
TTPY->getDefaultArgument());
}

if (auto *NTTPX = dyn_cast<NonTypeTemplateParmDecl>(X)) {
auto *NTTPY = cast<NonTypeTemplateParmDecl>(Y);
if (!NTTPX->hasDefaultArgument() || !NTTPY->hasDefaultArgument())
return false;

Expr *DefaultArgumentX = NTTPX->getDefaultArgument()->IgnoreImpCasts();
Expr *DefaultArgumentY = NTTPY->getDefaultArgument()->IgnoreImpCasts();
llvm::FoldingSetNodeID XID, YID;
DefaultArgumentX->Profile(XID, C, /*Canonical=*/true);
DefaultArgumentY->Profile(YID, C, /*Canonical=*/true);
return XID == YID;
}

auto *TTPX = cast<TemplateTemplateParmDecl>(X);
auto *TTPY = cast<TemplateTemplateParmDecl>(Y);

if (!TTPX->hasDefaultArgument() || !TTPY->hasDefaultArgument())
return false;

const TemplateArgument &TAX = TTPX->getDefaultArgument().getArgument();
const TemplateArgument &TAY = TTPY->getDefaultArgument().getArgument();
return C.hasSameTemplateName(TAX.getAsTemplate(), TAY.getAsTemplate());
}

/// Checks the validity of a template parameter list, possibly
/// considering the template parameter list from a previous
/// declaration.
Expand Down Expand Up @@ -2780,7 +2740,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
if (!OldTypeParm->getOwningModule() ||
isModuleUnitOfCurrentTU(OldTypeParm->getOwningModule()))
RedundantDefaultArg = true;
else if (!hasSameDefaultTemplateArgument(OldTypeParm, NewTypeParm)) {
else if (!getASTContext().isSameDefaultTemplateArgument(OldTypeParm,
NewTypeParm)) {
InconsistentDefaultArg = true;
PrevModuleName =
OldTypeParm->getImportedOwningModule()->getFullModuleName();
Expand Down Expand Up @@ -2832,8 +2793,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
if (!OldNonTypeParm->getOwningModule() ||
isModuleUnitOfCurrentTU(OldNonTypeParm->getOwningModule()))
RedundantDefaultArg = true;
else if (!hasSameDefaultTemplateArgument(OldNonTypeParm,
NewNonTypeParm)) {
else if (!getASTContext().isSameDefaultTemplateArgument(
OldNonTypeParm, NewNonTypeParm)) {
InconsistentDefaultArg = true;
PrevModuleName =
OldNonTypeParm->getImportedOwningModule()->getFullModuleName();
Expand Down Expand Up @@ -2884,8 +2845,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
if (!OldTemplateParm->getOwningModule() ||
isModuleUnitOfCurrentTU(OldTemplateParm->getOwningModule()))
RedundantDefaultArg = true;
else if (!hasSameDefaultTemplateArgument(OldTemplateParm,
NewTemplateParm)) {
else if (!getASTContext().isSameDefaultTemplateArgument(
OldTemplateParm, NewTemplateParm)) {
InconsistentDefaultArg = true;
PrevModuleName =
OldTemplateParm->getImportedOwningModule()->getFullModuleName();
Expand Down

0 comments on commit 8db8754

Please sign in to comment.