Skip to content

Commit 781d3c6

Browse files
committed
Promote isSameTemplateArg, and use llvm::APSInt::isSameValue
1 parent f474f05 commit 781d3c6

File tree

2 files changed

+6
-64
lines changed

2 files changed

+6
-64
lines changed

clang/lib/AST/ASTContext.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7648,7 +7648,7 @@ bool ASTContext::isSameTemplateArgument(const TemplateArgument &Arg1,
76487648

76497649
switch (Arg1.getKind()) {
76507650
case TemplateArgument::Null:
7651-
return true;
7651+
llvm_unreachable("Comparing NULL template argument");
76527652

76537653
case TemplateArgument::Type:
76547654
return hasSameType(Arg1.getAsType(), Arg2.getAsType());
@@ -7666,7 +7666,8 @@ bool ASTContext::isSameTemplateArgument(const TemplateArgument &Arg1,
76667666
getCanonicalTemplateName(Arg2.getAsTemplateOrTemplatePattern());
76677667

76687668
case TemplateArgument::Integral:
7669-
return Arg1.getAsIntegral() == Arg2.getAsIntegral();
7669+
return llvm::APSInt::isSameValue(Arg1.getAsIntegral(),
7670+
Arg2.getAsIntegral());
76707671

76717672
case TemplateArgument::StructuralValue:
76727673
return Arg1.structurallyEquals(Arg2);

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 3 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -114,27 +114,6 @@ namespace clang {
114114
using namespace clang;
115115
using namespace sema;
116116

117-
/// Compare two APSInts, extending and switching the sign as
118-
/// necessary to compare their values regardless of underlying type.
119-
static bool hasSameExtendedValue(llvm::APSInt X, llvm::APSInt Y) {
120-
if (Y.getBitWidth() > X.getBitWidth())
121-
X = X.extend(Y.getBitWidth());
122-
else if (Y.getBitWidth() < X.getBitWidth())
123-
Y = Y.extend(X.getBitWidth());
124-
125-
// If there is a signedness mismatch, correct it.
126-
if (X.isSigned() != Y.isSigned()) {
127-
// If the signed value is negative, then the values cannot be the same.
128-
if ((Y.isSigned() && Y.isNegative()) || (X.isSigned() && X.isNegative()))
129-
return false;
130-
131-
Y.setIsSigned(true);
132-
X.setIsSigned(true);
133-
}
134-
135-
return X == Y;
136-
}
137-
138117
/// The kind of PartialOrdering we're performing template argument deduction
139118
/// for (C++11 [temp.deduct.partial]).
140119
enum class PartialOrderingKind { None, NonCall, Call };
@@ -273,7 +252,7 @@ checkDeducedTemplateArguments(ASTContext &Context,
273252
if (Y.getKind() == TemplateArgument::Expression ||
274253
Y.getKind() == TemplateArgument::Declaration ||
275254
(Y.getKind() == TemplateArgument::Integral &&
276-
hasSameExtendedValue(X.getAsIntegral(), Y.getAsIntegral())))
255+
llvm::APSInt::isSameValue(X.getAsIntegral(), Y.getAsIntegral())))
277256
return X.wasDeducedFromArrayBound() ? Y : X;
278257

279258
// All other combinations are incompatible.
@@ -2574,7 +2553,7 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
25742553

25752554
case TemplateArgument::Integral:
25762555
if (A.getKind() == TemplateArgument::Integral) {
2577-
if (hasSameExtendedValue(P.getAsIntegral(), A.getAsIntegral()))
2556+
if (llvm::APSInt::isSameValue(P.getAsIntegral(), A.getAsIntegral()))
25782557
return TemplateDeductionResult::Success;
25792558
}
25802559
Info.FirstArg = P;
@@ -2828,44 +2807,6 @@ TemplateDeductionResult Sema::DeduceTemplateArguments(
28282807
/*HasDeducedAnyParam=*/nullptr);
28292808
}
28302809

2831-
/// Determine whether two template arguments are the same.
2832-
static bool isSameTemplateArg(ASTContext &Context, const TemplateArgument &X,
2833-
const TemplateArgument &Y) {
2834-
if (X.getKind() != Y.getKind())
2835-
return false;
2836-
2837-
switch (X.getKind()) {
2838-
case TemplateArgument::Null:
2839-
llvm_unreachable("Comparing NULL template argument");
2840-
2841-
case TemplateArgument::Type:
2842-
case TemplateArgument::Declaration:
2843-
case TemplateArgument::NullPtr:
2844-
case TemplateArgument::Template:
2845-
case TemplateArgument::TemplateExpansion:
2846-
case TemplateArgument::StructuralValue:
2847-
case TemplateArgument::Expression:
2848-
return Context.isSameTemplateArgument(X, Y);
2849-
2850-
case TemplateArgument::Integral:
2851-
return hasSameExtendedValue(X.getAsIntegral(), Y.getAsIntegral());
2852-
2853-
case TemplateArgument::Pack: {
2854-
unsigned PackIterationSize = X.pack_size();
2855-
if (X.pack_size() != Y.pack_size())
2856-
return false;
2857-
ArrayRef<TemplateArgument> XP = X.pack_elements();
2858-
ArrayRef<TemplateArgument> YP = Y.pack_elements();
2859-
for (unsigned i = 0; i < PackIterationSize; ++i)
2860-
if (!isSameTemplateArg(Context, XP[i], YP[i]))
2861-
return false;
2862-
return true;
2863-
}
2864-
}
2865-
2866-
llvm_unreachable("Invalid TemplateArgument Kind!");
2867-
}
2868-
28692810
TemplateArgumentLoc
28702811
Sema::getTrivialTemplateArgumentLoc(const TemplateArgument &Arg,
28712812
QualType NTTPType, SourceLocation Loc,
@@ -3331,7 +3272,7 @@ static TemplateDeductionResult FinishTemplateArgumentDeduction(
33313272
break;
33323273
TemplateArgument PP = P.isPackExpansion() ? P.getPackExpansionPattern() : P,
33333274
PA = A.isPackExpansion() ? A.getPackExpansionPattern() : A;
3334-
if (!isSameTemplateArg(S.Context, PP, PA)) {
3275+
if (!S.Context.isSameTemplateArgument(PP, PA)) {
33353276
if (!P.isPackExpansion() && !A.isPackExpansion()) {
33363277
Info.Param = makeTemplateParameter(TPL->getParam(
33373278
(AsStack.empty() ? As.end() : AsStack.back().begin()) -

0 commit comments

Comments
 (0)