Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 5 additions & 22 deletions clang/lib/Sema/SemaTemplateDeduction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down Expand Up @@ -2652,28 +2652,11 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
getDeducedNTTParameterFromExpr(Info, P.getAsExpr())) {
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) {
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;
}
// The type of the value is the type of the expression as written.
return DeduceNonTypeTemplateArgument(
S, TemplateParams, NTTP, DeducedTemplateArgument(A), E->getType(),
Info, PartialOrdering, Deduced, HasDeducedAnyParam);
S, TemplateParams, NTTP, DeducedTemplateArgument(A),
A.getAsExpr()->IgnoreImplicitAsWritten()->getType(), Info,
PartialOrdering, Deduced, HasDeducedAnyParam);
}
case TemplateArgument::Integral:
case TemplateArgument::StructuralValue:
Expand Down