Skip to content

Commit b59567b

Browse files
authored
[clang] always use resolved arguments for default argument deduction (#94756)
1 parent bbddedb commit b59567b

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)