-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[clang] always use resolved arguments for default argument deduction #94756
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang] always use resolved arguments for default argument deduction #94756
Conversation
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.
@llvm/pr-subscribers-clang Author: Matheus Izvekov (mizvekov) ChangesThis fixes a regression introduced with the changes in #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. Full diff: https://github.com/llvm/llvm-project/pull/94756.diff 2 Files Affected:
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 1011db2d2830d..befeb38e1fe5b 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -712,13 +712,6 @@ DeduceTemplateSpecArguments(Sema &S, TemplateParameterList *TemplateParams,
if (const auto *TD = TNA.getAsTemplateDecl(); TD && TD->isTypeAlias())
return TemplateDeductionResult::Success;
- // Perform template argument deduction for the template name.
- if (auto Result =
- DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,
- SA->template_arguments(), Deduced);
- Result != TemplateDeductionResult::Success)
- return Result;
-
// FIXME: To preserve sugar, the TST needs to carry sugared resolved
// arguments.
ArrayRef<TemplateArgument> AResolved =
@@ -726,6 +719,12 @@ DeduceTemplateSpecArguments(Sema &S, TemplateParameterList *TemplateParams,
->castAs<TemplateSpecializationType>()
->template_arguments();
+ // Perform template argument deduction for the template name.
+ if (auto Result = DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,
+ AResolved, Deduced);
+ Result != TemplateDeductionResult::Success)
+ return Result;
+
// Perform template argument deduction on each template
// argument. Ignore any missing/extra arguments, since they could be
// filled in by default arguments.
diff --git a/clang/test/SemaTemplate/cwg2398.cpp b/clang/test/SemaTemplate/cwg2398.cpp
index 45e74cce3a98c..f7f69e9d4268a 100644
--- a/clang/test/SemaTemplate/cwg2398.cpp
+++ b/clang/test/SemaTemplate/cwg2398.cpp
@@ -201,3 +201,19 @@ namespace consistency {
// new-error@-1 {{ambiguous partial specializations}}
} // namespace t2
} // namespace consistency
+
+namespace regression1 {
+ template <typename T, typename Y> struct map {};
+ template <typename T> class foo {};
+
+ template <template <typename...> class MapType, typename Value>
+ Value bar(MapType<int, Value> map);
+
+ template <template <typename...> class MapType, typename Value>
+ Value bar(MapType<int, foo<Value>> map);
+
+ void aux() {
+ map<int, foo<int>> input;
+ bar(input);
+ }
+} // namespace regression1
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This fixes a regression introduced with the changes in #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.