-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[clang] fix nondeduced mismatch with nullptr template arguments #124498
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] fix nondeduced mismatch with nullptr template arguments #124498
Conversation
|
@llvm/pr-subscribers-clang Author: Matheus Izvekov (mizvekov) ChangesIn deduction, when comparing template arguments of value kind, we should check if the value matches. Values of different types can still match. For example, Values of nullptr kind always match each other, since there is only one such possible value. Similarly to integrals, the type does not matter. Full diff: https://github.com/llvm/llvm-project/pull/124498.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 27574924a14a92..0556879251f89d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -996,6 +996,7 @@ Bug Fixes to C++ Support
- Fix template argument checking so that converted template arguments are
converted again. This fixes some issues with partial ordering involving
template template parameters with non-type template parameters.
+- Fix nondeduced mismatch with nullptr template arguments.
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 2b96692727a7c8..1e1fce10e7c017 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -2541,10 +2541,9 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
return TemplateDeductionResult::NonDeducedMismatch;
case TemplateArgument::NullPtr:
- if (A.getKind() == TemplateArgument::NullPtr &&
- S.Context.hasSameType(P.getNullPtrType(), A.getNullPtrType()))
+ // 'nullptr' has only one possible value, so it always matches.
+ if (A.getKind() == TemplateArgument::NullPtr)
return TemplateDeductionResult::Success;
-
Info.FirstArg = P;
Info.SecondArg = A;
return TemplateDeductionResult::NonDeducedMismatch;
@@ -2559,6 +2558,8 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
return TemplateDeductionResult::NonDeducedMismatch;
case TemplateArgument::StructuralValue:
+ // FIXME: structural equality will also compare types,
+ // but they should match iff they have the same value.
if (A.getKind() == TemplateArgument::StructuralValue &&
A.structurallyEquals(P))
return TemplateDeductionResult::Success;
diff --git a/clang/test/SemaTemplate/cwg2398.cpp b/clang/test/SemaTemplate/cwg2398.cpp
index 137b94ba2641de..dccb17c48d3256 100644
--- a/clang/test/SemaTemplate/cwg2398.cpp
+++ b/clang/test/SemaTemplate/cwg2398.cpp
@@ -697,15 +697,11 @@ namespace nttp_partial_order {
template void f<B>(B<&A::m>);
} // namespace t5
namespace t6 {
- // FIXME: This should pick the second overload.
struct A {};
using nullptr_t = decltype(nullptr);
template<template<nullptr_t> class TT2> void f(TT2<nullptr>);
- // new-note@-1 {{here}}
template<template<A*> class TT1> void f(TT1<nullptr>) {}
- // new-note@-1 {{here}}
template<A*> struct B {};
template void f<B>(B<nullptr>);
- // new-error@-1 {{ambiguous}}
} // namespace t6
} // namespace nttp_partial_order
|
zyn0217
left a comment
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.
Thanks
cor3ntin
left a comment
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
|
|
||
| case TemplateArgument::StructuralValue: | ||
| // FIXME: structural equality will also compare types, | ||
| // but they should match iff they have the same value. |
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.
| // but they should match iff they have the same value. | |
| // FIXME: Arguments of structural types should match when their values are the same, | |
| // even when their types are different. |
7b4befe to
8cf1056
Compare
In deduction, when comparing template arguments of value kind, we should check if the value matches. Values of different types can still match. For example, `short(0)` matches `int(0)`. Values of nullptr kind always match each other, since there is only one such possible value. Similarly to integrals, the type does not matter.
e8ded39 to
0e3246e
Compare
In deduction, when comparing template arguments of value kind, we should check if the value matches. Values of different types can still match. For example,
short(0)matchesint(0).Values of nullptr kind always match each other, since there is only one such possible value. Similarly to integrals, the type does not matter.