https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/124498
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. >From e8ded39966b65d36c6d84572626882e3c2594c78 Mon Sep 17 00:00:00 2001 From: Matheus Izvekov <mizve...@gmail.com> Date: Mon, 27 Jan 2025 00:04:59 -0300 Subject: [PATCH] [clang] fix nondeduced mismatch with nullptr template arguments 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. --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/Sema/SemaTemplateDeduction.cpp | 7 ++++--- clang/test/SemaTemplate/cwg2398.cpp | 4 ---- 3 files changed, 5 insertions(+), 7 deletions(-) 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 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits