https://github.com/mizvekov created https://github.com/llvm/llvm-project/pull/110393
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 >From adc2b02c4529edb15d9dc0df55b44abb9e8f4acc Mon Sep 17 00:00:00 2001 From: Matheus Izvekov <mizve...@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits