[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
This commit is contained in:
parent
9e0ca5720b
commit
7145ead280
@ -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
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -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<
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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>;
|
||||
|
Loading…
x
Reference in New Issue
Block a user