[clang] [clang] Improve deduction of reference typed NTTP (PR #110393)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Sat Sep 28 20:10:53 PDT 2024
https://github.com/mizvekov updated https://github.com/llvm/llvm-project/pull/110393
>From a06cdbc7a2d010a3f3081b7eb53326aeb7a702b1 Mon Sep 17 00:00:00 2001
From: Matheus Izvekov <mizvekov at gmail.com>
Date: Sat, 28 Sep 2024 21:40:54 -0300
Subject: [PATCH] [clang] Improve deduction of reference typed NTTP
This improves the existing workaround for a core issue introduced in
CWG1770.
When performing template argument deduction for an NNTP which the
parameter side is a reference, instead of dropping the references
for both sides, just make the argument be same reference typed as
the parameter, in case the argument is not already a reference type.
Fixes #73460
---
clang/docs/ReleaseNotes.rst | 1 +
clang/lib/Sema/SemaTemplateDeduction.cpp | 18 +++++++++---------
.../SemaTemplate/temp_arg_nontype_cxx1z.cpp | 8 ++++++++
3 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 2e9560f553d94f..9e486afda78c70 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -446,6 +446,7 @@ Bug Fixes to C++ Support
- Fixed an assertion failure in debug mode, and potential crashes in release mode, when
diagnosing a failed cast caused indirectly by a failed implicit conversion to the type of the constructor parameter.
- Fixed an assertion failure by adjusting integral to boolean vector conversions (#GH108326)
+- Fixed an issue deducing non-type template arguments of reference type. (#GH73460)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index cc095ae67ac400..d106874c4c5bda 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -440,18 +440,18 @@ DeduceNonTypeTemplateArgument(Sema &S, TemplateParameterList *TemplateParams,
// FIXME: It's not clear how deduction of a parameter of reference
// type from an argument (of non-reference type) should be performed.
- // For now, we just remove reference types from both sides and let
- // the final check for matching types sort out the mess.
- ValueType = ValueType.getNonReferenceType();
- if (ParamType->isReferenceType())
- ParamType = ParamType.getNonReferenceType();
- else
- // Top-level cv-qualifiers are irrelevant for a non-reference type.
- ValueType = ValueType.getUnqualifiedType();
+ // For now, we just make the argument have same reference type as the
+ // parameter.
+ if (ParamType->isReferenceType() && !ValueType->isReferenceType()) {
+ if (ParamType->isRValueReferenceType())
+ ValueType = S.Context.getRValueReferenceType(ValueType);
+ else
+ ValueType = S.Context.getLValueReferenceType(ValueType);
+ }
return DeduceTemplateArgumentsByTypeMatch(
S, TemplateParams, ParamType, ValueType, Info, Deduced,
- TDF_SkipNonDependent,
+ TDF_SkipNonDependent | TDF_IgnoreQualifiers,
PartialOrdering ? PartialOrderingKind::NonCall
: PartialOrderingKind::None,
/*ArrayBound=*/NewDeduced.wasDeducedFromArrayBound(), HasDeducedAnyParam);
diff --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
index ae06055bf52651..8d9356bb3201cd 100644
--- a/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
+++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp
@@ -613,3 +613,11 @@ struct {
template<typename T>
using a = s<f(T::x)>;
}
+
+namespace GH73460 {
+ template <class T, T, T> struct A;
+ template <class T, T n> struct A<T, n, n> {};
+
+ int j;
+ template struct A<int&, j, j>;
+} // namespace GH73460
More information about the cfe-commits
mailing list