Author: GeorgeKA Date: 2025-04-03T15:58:52+02:00 New Revision: 7145ead280ba10d08fe48e7859f1a61a64653104
URL: https://github.com/llvm/llvm-project/commit/7145ead280ba10d08fe48e7859f1a61a64653104 DIFF: https://github.com/llvm/llvm-project/commit/7145ead280ba10d08fe48e7859f1a61a64653104.diff LOG: [Clang] Add warning message for C++17 alias template CTAD (#133806) Alias template class template argument deduction is a documented C++20 feature. C++17 also happens to support it, but there is no message output to indicate the officially supported version. This PR adds that. Also updated relevant CTAD test cases. Closes #125913 Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaInit.cpp clang/test/SemaCXX/cxx17-compat.cpp clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index fdf9a246d6373..3055394dd8b6c 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -403,6 +403,7 @@ Bug Fixes to C++ Support - Clang no longer crashes when establishing subsumption between some constraint expressions. (#GH122581) - Clang now issues an error when placement new is used to modify a const-qualified variable in a ``constexpr`` function. (#GH131432) +- Clang now emits a warning when class template argument deduction for alias templates is used in C++17. (#GH133806) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 1993cd5accc22..52dc477039129 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -49,6 +49,8 @@ defm constexpr_ctor_missing_init : CXX20Compat< defm adl_only_template_id : CXX20Compat< "use of function template name with no prior declaration in function call " "with explicit template arguments is">; +defm ctad_for_alias_templates + : CXX20Compat<"class template argument deduction for alias templates is">; // C++23 compatibility with C++20 and earlier. defm constexpr_static_var : CXX23Compat< @@ -8448,11 +8450,6 @@ let CategoryName = "Lambda Issue" in { def warn_cxx17_compat_lambda_def_ctor_assign : Warning< "%select{default construction|assignment}0 of lambda is incompatible with " "C++ standards before C++20">, InGroup<CXXPre20Compat>, DefaultIgnore; - - // C++20 class template argument deduction for alias templates. - def warn_cxx17_compat_ctad_for_alias_templates : Warning< - "class template argument deduction for alias templates is incompatible with " - "C++ standards before C++20">, InGroup<CXXPre20Compat>, DefaultIgnore; } def err_return_in_captured_stmt : Error< diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 9814c3f456f0d..87a4244f2fb76 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -9919,8 +9919,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer( if (!Template) { if (auto *AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>( TemplateName.getAsTemplateDecl())) { - Diag(Kind.getLocation(), - diag::warn_cxx17_compat_ctad_for_alias_templates); + DiagCompat(Kind.getLocation(), diag_compat::ctad_for_alias_templates); LookupTemplateDecl = AliasTemplate; auto UnderlyingType = AliasTemplate->getTemplatedDecl() ->getUnderlyingType() diff --git a/clang/test/SemaCXX/cxx17-compat.cpp b/clang/test/SemaCXX/cxx17-compat.cpp index 54ea3384022d4..81b3e1fde5493 100644 --- a/clang/test/SemaCXX/cxx17-compat.cpp +++ b/clang/test/SemaCXX/cxx17-compat.cpp @@ -137,7 +137,7 @@ template<typename T> struct A { A(T); }; template<typename T> using B = A<T>; B b = {1}; #if __cplusplus <= 201703L - // FIXME: diagnose as well + // expected-warning@-2 {{class template argument deduction for alias templates is a C++20 extension}} #else // expected-warning@-4 {{class template argument deduction for alias templates is incompatible with C++ standards before C++20}} #endif diff --git a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp index 9aaa13d7ac41a..a7d740e66ba63 100644 --- a/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp +++ b/clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp @@ -113,9 +113,9 @@ namespace dependent { }; template<typename T> void f() { typename T::X tx = 0; - typename T::Y ty = 0; + typename T::Y ty = 0; // expected-warning {{class template argument deduction for alias templates is a C++20 extension}} } - template void f<B>(); + template void f<B>(); // expected-note {{in instantiation of function template specialization 'dependent::f<dependent::B>' requested here}} template<typename T> struct C { C(T); }; template<typename T> C(T) -> C<T>; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits