Skip to content

Commit dd97898

Browse files
committed
Add warning message for C++17 alias template CTAD
1 parent 4107544 commit dd97898

File tree

4 files changed

+16
-7
lines changed

4 files changed

+16
-7
lines changed

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8444,9 +8444,16 @@ let CategoryName = "Lambda Issue" in {
84448444
"C++ standards before C++20">, InGroup<CXXPre20Compat>, DefaultIgnore;
84458445

84468446
// C++20 class template argument deduction for alias templates.
8447-
def warn_cxx17_compat_ctad_for_alias_templates : Warning<
8448-
"class template argument deduction for alias templates is incompatible with "
8449-
"C++ standards before C++20">, InGroup<CXXPre20Compat>, DefaultIgnore;
8447+
def warn_cxx17_compat_ctad_for_alias_templates
8448+
: Warning<"class template argument deduction for alias templates is "
8449+
"incompatible with "
8450+
"C++ standards before C++20">,
8451+
InGroup<CXXPre20Compat>,
8452+
DefaultIgnore;
8453+
def ext_ctad_for_alias_templates_cxx20
8454+
: ExtWarn<"class template argument deduction for alias templates is a "
8455+
"C++20 extension">,
8456+
InGroup<CXX20>;
84508457
}
84518458

84528459
def err_return_in_captured_stmt : Error<

clang/lib/Sema/SemaInit.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9896,7 +9896,9 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
98969896
if (auto *AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>(
98979897
TemplateName.getAsTemplateDecl())) {
98989898
Diag(Kind.getLocation(),
9899-
diag::warn_cxx17_compat_ctad_for_alias_templates);
9899+
getLangOpts().CPlusPlus20
9900+
? diag::warn_cxx17_compat_ctad_for_alias_templates
9901+
: diag::ext_ctad_for_alias_templates_cxx20);
99009902
LookupTemplateDecl = AliasTemplate;
99019903
auto UnderlyingType = AliasTemplate->getTemplatedDecl()
99029904
->getUnderlyingType()

clang/test/SemaCXX/cxx17-compat.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ template<typename T> struct A { A(T); };
137137
template<typename T> using B = A<T>;
138138
B b = {1};
139139
#if __cplusplus <= 201703L
140-
// FIXME: diagnose as well
140+
// expected-warning@-2 {{class template argument deduction for alias templates is a C++20 extension}}
141141
#else
142142
// expected-warning@-4 {{class template argument deduction for alias templates is incompatible with C++ standards before C++20}}
143143
#endif

clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,9 @@ namespace dependent {
113113
};
114114
template<typename T> void f() {
115115
typename T::X tx = 0;
116-
typename T::Y ty = 0;
116+
typename T::Y ty = 0; // expected-warning {{class template argument deduction for alias templates is a C++20 extension}}
117117
}
118-
template void f<B>();
118+
template void f<B>(); // expected-note {{in instantiation of function template specialization 'dependent::f<dependent::B>' requested here}}
119119

120120
template<typename T> struct C { C(T); };
121121
template<typename T> C(T) -> C<T>;

0 commit comments

Comments
 (0)