[clang] fe73233 - Convert boolean flag in TemplateParameterListsAreEqual into an
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 30 17:00:48 PDT 2023
Author: Richard Smith
Date: 2023-03-30T17:00:16-07:00
New Revision: fe73233b3a8b7b9dbb457419b494200503ffd34a
URL: https://github.com/llvm/llvm-project/commit/fe73233b3a8b7b9dbb457419b494200503ffd34a
DIFF: https://github.com/llvm/llvm-project/commit/fe73233b3a8b7b9dbb457419b494200503ffd34a.diff
LOG: Convert boolean flag in TemplateParameterListsAreEqual into an
additional enum value and document its meaning.
No functionality change intended.
Added:
Modified:
clang/include/clang/Sema/Sema.h
clang/lib/Sema/SemaTemplate.cpp
clang/lib/Sema/SemaTemplateDeduction.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
index 3e4e288e143a..d7f0f1184a7e 100644
--- a/clang/include/clang/Sema/Sema.h
+++ b/clang/include/clang/Sema/Sema.h
@@ -8457,24 +8457,31 @@ class Sema final {
/// template<int Value> struct integer_c;
/// X<integer_c> xic;
/// \endcode
- TPL_TemplateTemplateArgumentMatch
+ TPL_TemplateTemplateArgumentMatch,
+
+ /// We are determining whether the template-parameters are equivalent
+ /// according to C++ [temp.over.link]/6. This comparison does not consider
+ /// constraints.
+ ///
+ /// \code
+ /// template<C1 T> void f(T);
+ /// template<C2 T> void f(T);
+ /// \endcode
+ TPL_TemplateParamsEquivalent,
};
bool TemplateParameterListsAreEqual(
const NamedDecl *NewInstFrom, TemplateParameterList *New,
const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
TemplateParameterListEqualKind Kind,
- SourceLocation TemplateArgLoc = SourceLocation(),
- bool PartialOrdering = false);
+ SourceLocation TemplateArgLoc = SourceLocation());
bool TemplateParameterListsAreEqual(
TemplateParameterList *New, TemplateParameterList *Old, bool Complain,
TemplateParameterListEqualKind Kind,
- SourceLocation TemplateArgLoc = SourceLocation(),
- bool PartialOrdering = false) {
+ SourceLocation TemplateArgLoc = SourceLocation()) {
return TemplateParameterListsAreEqual(nullptr, New, nullptr, Old, Complain,
- Kind, TemplateArgLoc,
- PartialOrdering);
+ Kind, TemplateArgLoc);
}
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams);
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index f1de491f1cd3..4a667d046f14 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -7967,8 +7967,7 @@ Sema::BuildExpressionFromIntegralTemplateArgument(const TemplateArgument &Arg,
static bool MatchTemplateParameterKind(
Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old,
const NamedDecl *OldInstFrom, bool Complain,
- Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc,
- bool PartialOrdering) {
+ Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {
// Check the actual kind (type, non-type, template).
if (Old->getKind() != New->getKind()) {
if (Complain) {
@@ -8056,11 +8055,12 @@ static bool MatchTemplateParameterKind(
(Kind == Sema::TPL_TemplateMatch
? Sema::TPL_TemplateTemplateParmMatch
: Kind),
- TemplateArgLoc, PartialOrdering))
+ TemplateArgLoc))
return false;
}
- if (!PartialOrdering && Kind != Sema::TPL_TemplateTemplateArgumentMatch &&
+ if (Kind != Sema::TPL_TemplateParamsEquivalent &&
+ Kind != Sema::TPL_TemplateTemplateArgumentMatch &&
!isa<TemplateTemplateParmDecl>(Old)) {
const Expr *NewC = nullptr, *OldC = nullptr;
@@ -8153,8 +8153,7 @@ void DiagnoseTemplateParameterListArityMismatch(Sema &S,
bool Sema::TemplateParameterListsAreEqual(
const NamedDecl *NewInstFrom, TemplateParameterList *New,
const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain,
- TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc,
- bool PartialOrdering) {
+ TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {
if (Old->size() != New->size() && Kind != TPL_TemplateTemplateArgumentMatch) {
if (Complain)
DiagnoseTemplateParameterListArityMismatch(*this, New, Old, Kind,
@@ -8186,7 +8185,7 @@ bool Sema::TemplateParameterListsAreEqual(
if (!MatchTemplateParameterKind(*this, *NewParm, NewInstFrom, *OldParm,
OldInstFrom, Complain, Kind,
- TemplateArgLoc, PartialOrdering))
+ TemplateArgLoc))
return false;
++NewParm;
@@ -8203,7 +8202,7 @@ bool Sema::TemplateParameterListsAreEqual(
for (; NewParm != NewParmEnd; ++NewParm) {
if (!MatchTemplateParameterKind(*this, *NewParm, NewInstFrom, *OldParm,
OldInstFrom, Complain, Kind,
- TemplateArgLoc, PartialOrdering))
+ TemplateArgLoc))
return false;
}
}
@@ -8217,7 +8216,8 @@ bool Sema::TemplateParameterListsAreEqual(
return false;
}
- if (!PartialOrdering && Kind != TPL_TemplateTemplateArgumentMatch) {
+ if (Kind != TPL_TemplateTemplateArgumentMatch &&
+ Kind != TPL_TemplateParamsEquivalent) {
const Expr *NewRC = New->getRequiresClause();
const Expr *OldRC = Old->getRequiresClause();
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 1fe2d3fac685..611ebc985938 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -5279,8 +5279,8 @@ FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(
// function parameters that positionally correspond between the two
// templates are not of the same type, neither template is more specialized
// than the other.
- if (!TemplateParameterListsAreEqual(
- TPL1, TPL2, false, Sema::TPL_TemplateMatch, SourceLocation(), true))
+ if (!TemplateParameterListsAreEqual(TPL1, TPL2, false,
+ Sema::TPL_TemplateParamsEquivalent))
return nullptr;
for (unsigned i = 0; i < NumParams1; ++i)
@@ -5637,8 +5637,8 @@ getMoreSpecialized(Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P1,
// function parameters that positionally correspond between the two
// templates are not of the same type, neither template is more specialized
// than the other.
- if (!S.TemplateParameterListsAreEqual(
- TPL1, TPL2, false, Sema::TPL_TemplateMatch, SourceLocation(), true))
+ if (!S.TemplateParameterListsAreEqual(TPL1, TPL2, false,
+ Sema::TPL_TemplateParamsEquivalent))
return nullptr;
if (!TemplateArgumentListAreEqual(S.getASTContext())(P1, P2))
More information about the cfe-commits
mailing list