[llvm-branch-commits] [clang] [clang] fix nondeduced mismatch with nullptr template arguments (PR #124498)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Jan 26 19:20:39 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Matheus Izvekov (mizvekov)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/124498.diff
3 Files Affected:
- (modified) clang/docs/ReleaseNotes.rst (+1)
- (modified) clang/lib/Sema/SemaTemplateDeduction.cpp (+4-3)
- (modified) clang/test/SemaTemplate/cwg2398.cpp (-4)
``````````diff
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 at -1 {{here}}
template<template<A*> class TT1> void f(TT1<nullptr>) {}
- // new-note at -1 {{here}}
template<A*> struct B {};
template void f<B>(B<nullptr>);
- // new-error at -1 {{ambiguous}}
} // namespace t6
} // namespace nttp_partial_order
``````````
</details>
https://github.com/llvm/llvm-project/pull/124498
More information about the llvm-branch-commits
mailing list