[clang] [clang] simplify constant template parameter type deduction for partial ordering (PR #160433)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 23 19:59:23 PDT 2025
https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/160433
This simplifies things a little bit. This is mostly NFCish, except the reference type deduction workaround now applies in partial ordering as well, but we don't have any test cases and any reason to suspect this is significant.
>From 09539afc2a129151b3fca756f73639d99a403e1a Mon Sep 17 00:00:00 2001
From: Matheus Izvekov <mizvekov at gmail.com>
Date: Tue, 23 Sep 2025 23:18:29 -0300
Subject: [PATCH] [clang] simplify constant template parameter type deduction
for partial ordering
This simplifies things a little bit. This is mostly NFCish, except
the reference type deduction workaround now applies in partial ordering
as well, but we don't have any test cases and any reason to suspect
this is significant.
---
clang/lib/Sema/SemaTemplateDeduction.cpp | 22 +++++-----------------
1 file changed, 5 insertions(+), 17 deletions(-)
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 62e867c44ad14..b0d2554d819cb 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -483,7 +483,7 @@ DeduceNonTypeTemplateArgument(Sema &S, TemplateParameterList *TemplateParams,
return TemplateDeductionResult::Inconsistent;
}
Deduced[NTTP.getIndex()] = Result;
- if (!S.getLangOpts().CPlusPlus17)
+ if (!S.getLangOpts().CPlusPlus17 && !PartialOrdering)
return TemplateDeductionResult::Success;
if (NTTP.isExpandedParameterPack())
@@ -2653,23 +2653,11 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
switch (A.getKind()) {
case TemplateArgument::Expression: {
const Expr *E = A.getAsExpr();
- // When checking NTTP, if either the parameter or the argument is
- // dependent, as there would be otherwise nothing to deduce, we force
- // the argument to the parameter type using this dependent implicit
- // cast, in order to maintain invariants. Now we can deduce the
- // resulting type from the original type, and deduce the original type
- // against the parameter we are checking.
- if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E);
- ICE && ICE->getCastKind() == clang::CK_Dependent) {
+ // The type of the value is the type of the expression before any
+ // implicit conversions.
+ if (const auto *ICE = dyn_cast<ImplicitCastExpr>(E)) {
E = ICE->getSubExpr();
- if (auto Result = DeduceTemplateArgumentsByTypeMatch(
- S, TemplateParams, ICE->getType(), E->getType(), Info,
- Deduced, TDF_SkipNonDependent,
- PartialOrdering ? PartialOrderingKind::NonCall
- : PartialOrderingKind::None,
- /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
- Result != TemplateDeductionResult::Success)
- return Result;
+ assert(!isa<ImplicitCastExpr>(E));
}
return DeduceNonTypeTemplateArgument(
S, TemplateParams, NTTP, DeducedTemplateArgument(A), E->getType(),
More information about the cfe-commits
mailing list