Skip to content

Commit df6049f

Browse files
committed
[clang] always use resolved arguments for default argument deduction
This fixes a regression introduced with the changes in llvm#93433 around preservation of TemplateName sugar in template type deduction. Since the argument side TST is non-canonical, we have to extract the arguments from it's canonical type. This was done for the deduction of the TST arguments, but we missed it for the default arguments used in the deduction of the TST name.
1 parent ac02168 commit df6049f

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -712,20 +712,19 @@ DeduceTemplateSpecArguments(Sema &S, TemplateParameterList *TemplateParams,
712712
if (const auto *TD = TNA.getAsTemplateDecl(); TD && TD->isTypeAlias())
713713
return TemplateDeductionResult::Success;
714714

715-
// Perform template argument deduction for the template name.
716-
if (auto Result =
717-
DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,
718-
SA->template_arguments(), Deduced);
719-
Result != TemplateDeductionResult::Success)
720-
return Result;
721-
722715
// FIXME: To preserve sugar, the TST needs to carry sugared resolved
723716
// arguments.
724717
ArrayRef<TemplateArgument> AResolved =
725718
SA->getCanonicalTypeInternal()
726719
->castAs<TemplateSpecializationType>()
727720
->template_arguments();
728721

722+
// Perform template argument deduction for the template name.
723+
if (auto Result = DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,
724+
AResolved, Deduced);
725+
Result != TemplateDeductionResult::Success)
726+
return Result;
727+
729728
// Perform template argument deduction on each template
730729
// argument. Ignore any missing/extra arguments, since they could be
731730
// filled in by default arguments.

clang/test/SemaTemplate/cwg2398.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,3 +201,19 @@ namespace consistency {
201201
// new-error@-1 {{ambiguous partial specializations}}
202202
} // namespace t2
203203
} // namespace consistency
204+
205+
namespace regression1 {
206+
template <typename T, typename Y> struct map {};
207+
template <typename T> class foo {};
208+
209+
template <template <typename...> class MapType, typename Value>
210+
Value bar(MapType<int, Value> map);
211+
212+
template <template <typename...> class MapType, typename Value>
213+
Value bar(MapType<int, foo<Value>> map);
214+
215+
void aux() {
216+
map<int, foo<int>> input;
217+
bar(input);
218+
}
219+
} // namespace regression1

0 commit comments

Comments
 (0)