[clang] [Clang] [NFC] Introduce helpers for defining compatibilty warnings (PR #132129)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 20 09:51:41 PDT 2025
https://github.com/Sirraide updated https://github.com/llvm/llvm-project/pull/132129
>From ce40f50211739b0c3f18f96767b0ca1fa144c469 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 01:43:39 +0100
Subject: [PATCH 1/7] [Clang] [NFC] Introduce helpers for defining compatibilty
warnings
---
clang/include/clang/Basic/Diagnostic.td | 43 +++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/clang/include/clang/Basic/Diagnostic.td b/clang/include/clang/Basic/Diagnostic.td
index 0b8b3af939ba0..85b7276695613 100644
--- a/clang/include/clang/Basic/Diagnostic.td
+++ b/clang/include/clang/Basic/Diagnostic.td
@@ -155,6 +155,49 @@ class DefaultWarnNoWerror {
}
class DefaultRemark { Severity DefaultSeverity = SEV_Remark; }
+// C++ compatibility warnings
+multiclass CXXCompatWarn<
+ string message,
+ bit default_ignore,
+ int std_ver,
+ string std_ver_override = ""#std_ver> {
+ // 'X is a C++YZ extension'.
+ def compat_pre_cxx#std_ver#_#NAME :
+ Diagnostic<!strconcat(message, " a C++", std_ver_override, " extension"),
+ CLASS_EXTENSION,
+ !if(default_ignore, SEV_Ignored, SEV_Warning)>,
+ InGroup<!cast<DiagGroup>("CXX"#std_ver)>;
+
+ // 'X is incompatible with C++98' (if std_ver == 11).
+ // 'X is incompatible with C++ standards before C++YZ' (otherwise).
+ def compat_cxx#std_ver#_#NAME :
+ Warning<!if(!eq(std_ver, 11),
+ !strconcat(message, " incompatible with C++98"),
+ !strconcat(message, " incompatible with C++ standards before C++", std_ver_override))>,
+ InGroup<!cast<DiagGroup>(!if(!eq(std_ver, 11),
+ "CXX98Compat",
+ "CXXPre"#std_ver#"Compat"))>,
+ DefaultIgnore;
+}
+
+multiclass CXX11CompatWarn<string message, bit default_ignore = false>
+ : CXXCompatWarn<message, default_ignore, 11>;
+
+multiclass CXX14CompatWarn<string message, bit default_ignore = false>
+ : CXXCompatWarn<message, default_ignore, 14>;
+
+multiclass CXX17CompatWarn<string message, bit default_ignore = false>
+ : CXXCompatWarn<message, default_ignore, 17>;
+
+multiclass CXX20CompatWarn<string message, bit default_ignore = false>
+ : CXXCompatWarn<message, default_ignore, 20>;
+
+multiclass CXX23CompatWarn<string message, bit default_ignore = false>
+ : CXXCompatWarn<message, default_ignore, 23>;
+
+multiclass CXX26CompatWarn<string message, bit default_ignore = false>
+ : CXXCompatWarn<message, default_ignore, 26, "2c">;
+
// Definitions for Diagnostics.
include "DiagnosticASTKinds.td"
include "DiagnosticCommentKinds.td"
>From ac894bf305da482781ff7ada87704a4f2eb3b5a7 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 01:47:13 +0100
Subject: [PATCH 2/7] Refactor compatibility warnings in Sema
---
.../clang/Basic/DiagnosticSemaKinds.td | 202 +++++-------------
clang/lib/Sema/SemaDecl.cpp | 12 +-
clang/lib/Sema/SemaDeclCXX.cpp | 65 +++---
clang/lib/Sema/SemaExpr.cpp | 4 +-
clang/lib/Sema/SemaTemplate.cpp | 25 +--
clang/test/AST/ByteCode/if.cpp | 2 +-
clang/test/CXX/drs/cwg13xx.cpp | 12 +-
clang/test/CXX/drs/cwg1xx.cpp | 2 +-
clang/test/CXX/drs/cwg3xx.cpp | 4 +-
.../CXX/temp/temp.arg/temp.arg.nontype/p5.cpp | 2 +-
clang/test/Misc/warning-flags.c | 3 +-
clang/test/Parser/cxx1z-decomposition.cpp | 12 +-
clang/test/Parser/decomposed-condition.cpp | 24 +--
clang/test/SemaCXX/cxx98-compat.cpp | 6 +-
clang/test/SemaObjCXX/message.mm | 6 +-
clang/test/SemaTemplate/temp_arg_nontype.cpp | 2 +-
.../SemaTemplate/typename-specifier-4.cpp | 2 +-
.../test/SemaTemplate/typename-specifier.cpp | 12 +-
18 files changed, 154 insertions(+), 243 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 1536a3b8c920a..4ef1ab0ca4470 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12,6 +12,61 @@
let Component = "Sema" in {
let CategoryName = "Semantic Issue" in {
+// C++11 compatibility with C++98.
+defm nonclass_type_friend : CXX11CompatWarn<"non-class friend type %0 is">;
+defm static_data_member_in_union : CXX11CompatWarn<"static data member %0 in union is">;
+defm templ_default_in_function_templ : CXX11CompatWarn<
+ "default template arguments for a function template are">;
+defm template_arg_extra_parens : CXX11CompatWarn<
+ "parentheses around address non-type template argument are">;
+defm typename_outside_of_template : CXX11CompatWarn<"'typename' outside of a template is">;
+
+// C++14 compatibility with C++11 and earlier.
+defm constexpr_type_definition : CXX14CompatWarn<
+ "type definition in a constexpr %select{function|constructor}0 is">;
+defm constexpr_local_var : CXX14CompatWarn<
+ "variable declaration in a constexpr %select{function|constructor}0 is">;
+defm constexpr_body_multiple_return : CXX14CompatWarn<
+ "multiple return statements in constexpr function is">;
+defm variable_template : CXX14CompatWarn<"variable templates are">;
+
+// C++17 compatibility with C++14 and earlier.
+defm decomp_decl : CXX17CompatWarn<"decomposition declarations are">;
+defm inline_variable : CXX17CompatWarn<"inline variables are">;
+
+// C++20 compatibility with C++17 and earlier.
+defm decomp_decl_spec : CXX20CompatWarn<
+ "decomposition declaration declared "
+ "%plural{1:'%1'|:with '%1' specifiers}0 is">;
+defm constexpr_local_var_no_init : CXX20CompatWarn<
+ "uninitialized variable in a constexpr %select{function|constructor}0 is">;
+defm constexpr_function_try_block : CXX20CompatWarn<
+ "function try block in constexpr %select{function|constructor}0 is">;
+defm constexpr_union_ctor_no_init : CXX20CompatWarn<
+ "constexpr union constructor that does not initialize any member is">;
+defm constexpr_ctor_missing_init : CXX20CompatWarn<
+ "constexpr constructor that does not initialize all members is">;
+defm adl_only_template_id : CXX20CompatWarn<
+ "use of function template name with no prior declaration in function call "
+ "with explicit template arguments is">;
+
+// C++23 compatibility with C++20 and earlier.
+defm constexpr_static_var : CXX23CompatWarn<
+ "definition of a %select{static|thread_local}1 variable "
+ "in a constexpr %select{function|constructor}0 "
+ "is">;
+
+// C++26 compatibility with C++23 and earlier.
+defm decomp_decl_cond : CXX26CompatWarn<"structured binding declaration in a condition is">;
+
+// Compatibility warnings duplicated across multiple language versions.
+foreach std = [14, 20, 23] in {
+ defm constexpr_body_invalid_stmt : CXXCompatWarn<
+ "use of this statement in a constexpr %select{function|constructor}0 is",
+ /*default_ignore=*/false,
+ std>;
+}
+
def note_previous_decl : Note<"%0 declared here">;
def note_entity_declared_at : Note<"%0 declared here">;
def note_callee_decl : Note<"%0 declared here">;
@@ -523,30 +578,9 @@ def warn_modifying_shadowing_decl :
// C++ decomposition declarations
def err_decomp_decl_context : Error<
"decomposition declaration not permitted in this context">;
-def warn_cxx14_compat_decomp_decl : Warning<
- "decomposition declarations are incompatible with "
- "C++ standards before C++17">, DefaultIgnore, InGroup<CXXPre17Compat>;
-def ext_decomp_decl : ExtWarn<
- "decomposition declarations are a C++17 extension">, InGroup<CXX17>;
-def ext_decomp_decl_cond : ExtWarn<
- "structured binding declaration in a condition is a C++2c extenstion">,
- InGroup<CXX26>;
-def warn_cxx26_decomp_decl_cond : Warning<
- "structured binding declaration in a condition is incompatible with "
- "C++ standards before C++2c">,
- InGroup<CXXPre26Compat>, DefaultIgnore;
def err_decomp_decl_spec : Error<
"decomposition declaration cannot be declared "
"%plural{1:'%1'|:with '%1' specifiers}0">;
-def ext_decomp_decl_spec : ExtWarn<
- "decomposition declaration declared "
- "%plural{1:'%1'|:with '%1' specifiers}0 is a C++20 extension">,
- InGroup<CXX20>;
-def warn_cxx17_compat_decomp_decl_spec : Warning<
- "decomposition declaration declared "
- "%plural{1:'%1'|:with '%1' specifiers}0 "
- "is incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
def err_decomp_decl_type : Error<
"decomposition declaration cannot be declared with type %0; "
"declared type must be 'auto' or reference to 'auto'">;
@@ -1695,12 +1729,6 @@ def warn_consteval_if_always_true : Warning<
"consteval if is always true in an %select{unevaluated|immediate}0 context">,
InGroup<DiagGroup<"redundant-consteval-if">>;
-def ext_inline_variable : ExtWarn<
- "inline variables are a C++17 extension">, InGroup<CXX17>;
-def warn_cxx14_compat_inline_variable : Warning<
- "inline variables are incompatible with C++ standards before C++17">,
- DefaultIgnore, InGroup<CXXPre17Compat>;
-
def warn_inline_namespace_reopened_noninline : Warning<
"inline namespace reopened as a non-inline namespace">,
InGroup<InlineNamespaceReopenedNoninline>;
@@ -1716,11 +1744,6 @@ def ext_enum_friend : ExtWarn<
InGroup<DiagGroup<"friend-enum">>;
def note_enum_friend : Note<
"remove 'enum%select{| struct| class}0' to befriend an enum">;
-def ext_nonclass_type_friend : ExtWarn<
- "non-class friend type %0 is a C++11 extension">, InGroup<CXX11>;
-def warn_cxx98_compat_nonclass_type_friend : Warning<
- "non-class friend type %0 is incompatible with C++98">,
- InGroup<CXX98Compat>, DefaultIgnore;
def err_friend_is_member : Error<
"friends cannot be members of the declaring class">;
def warn_cxx98_compat_friend_is_member : Warning<
@@ -2152,11 +2175,6 @@ def select_tag_type_kind : TextSubstitution<
def err_static_data_member_not_allowed_in_anon_struct : Error<
"static data member %0 not allowed in anonymous "
"%sub{select_tag_type_kind}1">;
-def ext_static_data_member_in_union : ExtWarn<
- "static data member %0 in union is a C++11 extension">, InGroup<CXX11>;
-def warn_cxx98_compat_static_data_member_in_union : Warning<
- "static data member %0 in union is incompatible with C++98">,
- InGroup<CXX98Compat>, DefaultIgnore;
def ext_union_member_of_reference_type : ExtWarn<
"union member %0 has reference type %1, which is a Microsoft extension">,
InGroup<MicrosoftUnionMemberReference>;
@@ -2904,63 +2922,17 @@ def err_constexpr_non_literal_param : Error<
"not a literal type">;
def err_constexpr_body_invalid_stmt : Error<
"statement not allowed in %select{constexpr|consteval}1 %select{function|constructor}0">;
-def ext_constexpr_body_invalid_stmt : ExtWarn<
- "use of this statement in a constexpr %select{function|constructor}0 "
- "is a C++14 extension">, InGroup<CXX14>;
-def warn_cxx11_compat_constexpr_body_invalid_stmt : Warning<
- "use of this statement in a constexpr %select{function|constructor}0 "
- "is incompatible with C++ standards before C++14">,
- InGroup<CXXPre14Compat>, DefaultIgnore;
-def ext_constexpr_body_invalid_stmt_cxx20 : ExtWarn<
- "use of this statement in a constexpr %select{function|constructor}0 "
- "is a C++20 extension">, InGroup<CXX20>;
-def warn_cxx17_compat_constexpr_body_invalid_stmt : Warning<
- "use of this statement in a constexpr %select{function|constructor}0 "
- "is incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
-def ext_constexpr_body_invalid_stmt_cxx23 : ExtWarn<
- "use of this statement in a constexpr %select{function|constructor}0 "
- "is a C++23 extension">, InGroup<CXX23>;
-def warn_cxx20_compat_constexpr_body_invalid_stmt : Warning<
- "use of this statement in a constexpr %select{function|constructor}0 "
- "is incompatible with C++ standards before C++23">,
- InGroup<CXXPre23Compat>, DefaultIgnore;
-def ext_constexpr_type_definition : ExtWarn<
- "type definition in a constexpr %select{function|constructor}0 "
- "is a C++14 extension">, InGroup<CXX14>;
-def warn_cxx11_compat_constexpr_type_definition : Warning<
- "type definition in a constexpr %select{function|constructor}0 "
- "is incompatible with C++ standards before C++14">,
- InGroup<CXXPre14Compat>, DefaultIgnore;
def err_constexpr_vla : Error<
"variably-modified type %0 cannot be used in a constexpr "
"%select{function|constructor}1">;
-def ext_constexpr_local_var : ExtWarn<
- "variable declaration in a constexpr %select{function|constructor}0 "
- "is a C++14 extension">, InGroup<CXX14>;
-def warn_cxx11_compat_constexpr_local_var : Warning<
- "variable declaration in a constexpr %select{function|constructor}0 "
- "is incompatible with C++ standards before C++14">,
- InGroup<CXXPre14Compat>, DefaultIgnore;
-def ext_constexpr_static_var : ExtWarn<
- "definition of a %select{static|thread_local}1 variable "
- "in a constexpr %select{function|constructor}0 "
- "is a C++23 extension">, InGroup<CXX23>;
def warn_cxx20_compat_constexpr_var : Warning<
- "definition of a %select{static variable|thread_local variable|variable "
- "of non-literal type}1 in a constexpr %select{function|constructor}0 "
+ "definition of a variable of non-literal type in a constexpr "
+ "%select{function|constructor}0 "
"is incompatible with C++ standards before C++23">,
InGroup<CXXPre23Compat>, DefaultIgnore;
def err_constexpr_local_var_non_literal_type : Error<
"variable of non-literal type %1 cannot be defined in a constexpr "
"%select{function|constructor}0 before C++23">;
-def ext_constexpr_local_var_no_init : ExtWarn<
- "uninitialized variable in a constexpr %select{function|constructor}0 "
- "is a C++20 extension">, InGroup<CXX20>;
-def warn_cxx17_compat_constexpr_local_var_no_init : Warning<
- "uninitialized variable in a constexpr %select{function|constructor}0 "
- "is incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
def ext_constexpr_function_never_constant_expr : ExtWarn<
"%select{constexpr|consteval}1 %select{function|constructor}0 never produces a "
"constant expression">, InGroup<DiagGroup<"invalid-constexpr">>, DefaultError;
@@ -2982,41 +2954,11 @@ def err_constexpr_return_missing_expr : Error<
def warn_cxx11_compat_constexpr_body_no_return : Warning<
"constexpr function with no return statements is incompatible with C++ "
"standards before C++14">, InGroup<CXXPre14Compat>, DefaultIgnore;
-def ext_constexpr_body_multiple_return : ExtWarn<
- "multiple return statements in constexpr function is a C++14 extension">,
- InGroup<CXX14>;
-def warn_cxx11_compat_constexpr_body_multiple_return : Warning<
- "multiple return statements in constexpr function "
- "is incompatible with C++ standards before C++14">,
- InGroup<CXXPre14Compat>, DefaultIgnore;
def note_constexpr_body_previous_return : Note<
"previous return statement is here">;
def err_ms_constexpr_cannot_be_applied : Error<
"attribute 'msvc::constexpr' cannot be applied to the %select{constexpr|consteval|virtual}0 function %1">;
-// C++20 function try blocks in constexpr
-def ext_constexpr_function_try_block_cxx20 : ExtWarn<
- "function try block in constexpr %select{function|constructor}0 is "
- "a C++20 extension">, InGroup<CXX20>;
-def warn_cxx17_compat_constexpr_function_try_block : Warning<
- "function try block in constexpr %select{function|constructor}0 is "
- "incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
-
-def ext_constexpr_union_ctor_no_init : ExtWarn<
- "constexpr union constructor that does not initialize any member "
- "is a C++20 extension">, InGroup<CXX20>;
-def warn_cxx17_compat_constexpr_union_ctor_no_init : Warning<
- "constexpr union constructor that does not initialize any member "
- "is incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
-def ext_constexpr_ctor_missing_init : ExtWarn<
- "constexpr constructor that does not initialize all members "
- "is a C++20 extension">, InGroup<CXX20>;
-def warn_cxx17_compat_constexpr_ctor_missing_init : Warning<
- "constexpr constructor that does not initialize all members "
- "is incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
def note_constexpr_ctor_missing_init : Note<
"member not initialized by constructor">;
def note_non_literal_no_constexpr_ctors : Note<
@@ -5293,12 +5235,6 @@ def note_template_param_prev_default_arg_in_other_module : Note<
"previous default template argument defined in module %0">;
def err_template_param_default_arg_missing : Error<
"template parameter missing a default argument">;
-def ext_template_parameter_default_in_function_template : ExtWarn<
- "default template arguments for a function template are a C++11 extension">,
- InGroup<CXX11>;
-def warn_cxx98_compat_template_parameter_default_in_function_template : Warning<
- "default template arguments for a function template are incompatible with C++98">,
- InGroup<CXX98Compat>, DefaultIgnore;
def err_template_parameter_default_template_member : Error<
"cannot add a default template argument to the definition of a member of a "
"class template">;
@@ -5307,11 +5243,6 @@ def err_template_parameter_default_friend_template : Error<
def err_template_template_parm_no_parms : Error<
"template template parameter must have its own template parameters">;
-def ext_variable_template : ExtWarn<"variable templates are a C++14 extension">,
- InGroup<CXX14>;
-def warn_cxx11_compat_variable_template : Warning<
- "variable templates are incompatible with C++ standards before C++14">,
- InGroup<CXXPre14Compat>, DefaultIgnore;
def err_template_variable_noparams : Error<
"extraneous 'template<>' in declaration of variable %0">;
def err_template_member : Error<"non-static data member %0 cannot be declared as a template">;
@@ -5321,15 +5252,6 @@ def err_template_member_noparams : Error<
def err_template_tag_noparams : Error<
"extraneous 'template<>' in declaration of %0 %1">;
-def warn_cxx17_compat_adl_only_template_id : Warning<
- "use of function template name with no prior function template "
- "declaration in function call with explicit template arguments "
- "is incompatible with C++ standards before C++20">,
- InGroup<CXXPre20Compat>, DefaultIgnore;
-def ext_adl_only_template_id : ExtWarn<
- "use of function template name with no prior declaration in function call "
- "with explicit template arguments is a C++20 extension">, InGroup<CXX20>;
-
def warn_unqualified_call_to_std_cast_function : Warning<
"unqualified call to '%0'">, InGroup<DiagGroup<"unqualified-std-cast-call">>;
@@ -5468,11 +5390,6 @@ def err_template_arg_not_pointer_to_member_form : Error<
"non-type template argument is not a pointer to member constant">;
def err_template_arg_invalid : Error<
"non-type template argument '%0' is invalid">;
-def ext_template_arg_extra_parens : ExtWarn<
- "address non-type template argument cannot be surrounded by parentheses">;
-def warn_cxx98_compat_template_arg_extra_parens : Warning<
- "redundant parentheses surrounding address non-type template argument are "
- "incompatible with C++98">, InGroup<CXX98Compat>, DefaultIgnore;
def err_pointer_to_member_type : Error<
"invalid use of pointer to member type after %select{.*|->*}0">;
def err_pointer_to_member_call_drops_quals : Error<
@@ -5887,11 +5804,6 @@ def err_typename_missing_template
def ext_typename_missing
: ExtWarn<"missing 'typename' prior to dependent type name %0">,
InGroup<DiagGroup<"typename-missing">>;
-def ext_typename_outside_of_template : ExtWarn<
- "'typename' occurs outside of a template">, InGroup<CXX11>;
-def warn_cxx98_compat_typename_outside_of_template : Warning<
- "use of 'typename' outside of a template is incompatible with C++98">,
- InGroup<CXX98Compat>, DefaultIgnore;
def err_typename_refers_to_using_value_decl : Error<
"typename specifier refers to a dependent using declaration for a value "
"%0 in %1">;
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 61e3cd4066a8d..67d734c8cf8a2 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -7648,8 +7648,8 @@ NamedDecl *Sema::ActOnVariableDeclarator(
// Only C++1y supports variable templates (N3651).
Diag(D.getIdentifierLoc(),
getLangOpts().CPlusPlus14
- ? diag::warn_cxx11_compat_variable_template
- : diag::ext_variable_template);
+ ? diag::compat_cxx14_variable_template
+ : diag::compat_pre_cxx14_variable_template);
}
}
} else {
@@ -7717,8 +7717,8 @@ NamedDecl *Sema::ActOnVariableDeclarator(
// the program is ill-formed. C++11 drops this restriction.
Diag(D.getIdentifierLoc(),
getLangOpts().CPlusPlus11
- ? diag::warn_cxx98_compat_static_data_member_in_union
- : diag::ext_static_data_member_in_union)
+ ? diag::compat_cxx11_static_data_member_in_union
+ : diag::compat_pre_cxx11_static_data_member_in_union)
<< Name;
}
}
@@ -7821,8 +7821,8 @@ NamedDecl *Sema::ActOnVariableDeclarator(
<< FixItHint::CreateRemoval(D.getDeclSpec().getInlineSpecLoc());
} else {
Diag(D.getDeclSpec().getInlineSpecLoc(),
- getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_inline_variable
- : diag::ext_inline_variable);
+ getLangOpts().CPlusPlus17 ? diag::compat_cxx17_inline_variable
+ : diag::compat_pre_cxx17_inline_variable);
NewVD->setInlineSpecified();
}
}
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index bd6321c46a78f..753beeb3c5349 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -745,12 +745,12 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
unsigned DiagID;
if (!getLangOpts().CPlusPlus17)
- DiagID = diag::ext_decomp_decl;
+ DiagID = diag::compat_pre_cxx17_decomp_decl;
else if (D.getContext() == DeclaratorContext::Condition)
- DiagID = getLangOpts().CPlusPlus26 ? diag::warn_cxx26_decomp_decl_cond
- : diag::ext_decomp_decl_cond;
+ DiagID = getLangOpts().CPlusPlus26 ? diag::compat_cxx26_decomp_decl_cond
+ : diag::compat_pre_cxx26_decomp_decl_cond;
else
- DiagID = diag::warn_cxx14_compat_decomp_decl;
+ DiagID = diag::compat_cxx17_decomp_decl;
Diag(Decomp.getLSquareLoc(), DiagID) << Decomp.getSourceRange();
@@ -808,8 +808,8 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
} else if (!CPlusPlus20Specifiers.empty()) {
auto &&Warn = Diag(CPlusPlus20SpecifierLocs.front(),
getLangOpts().CPlusPlus20
- ? diag::warn_cxx17_compat_decomp_decl_spec
- : diag::ext_decomp_decl_spec);
+ ? diag::compat_cxx20_decomp_decl_spec
+ : diag::compat_pre_cxx20_decomp_decl_spec);
Warn << (int)CPlusPlus20Specifiers.size()
<< llvm::join(CPlusPlus20Specifiers.begin(),
CPlusPlus20Specifiers.end(), " ");
@@ -2041,8 +2041,8 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
if (Kind == Sema::CheckConstexprKind::Diagnose) {
SemaRef.Diag(DS->getBeginLoc(),
SemaRef.getLangOpts().CPlusPlus14
- ? diag::warn_cxx11_compat_constexpr_type_definition
- : diag::ext_constexpr_type_definition)
+ ? diag::compat_cxx14_constexpr_type_definition
+ : diag::compat_pre_cxx14_constexpr_type_definition)
<< isa<CXXConstructorDecl>(Dcl);
} else if (!SemaRef.getLangOpts().CPlusPlus14) {
return false;
@@ -2069,8 +2069,8 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
if (Kind == Sema::CheckConstexprKind::Diagnose) {
SemaRef.Diag(VD->getLocation(),
SemaRef.getLangOpts().CPlusPlus23
- ? diag::warn_cxx20_compat_constexpr_var
- : diag::ext_constexpr_static_var)
+ ? diag::compat_cxx23_constexpr_static_var
+ : diag::compat_pre_cxx23_constexpr_static_var)
<< isa<CXXConstructorDecl>(Dcl)
<< (VD->getTLSKind() == VarDecl::TLS_Dynamic);
} else if (!SemaRef.getLangOpts().CPlusPlus23) {
@@ -2080,8 +2080,7 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
if (SemaRef.LangOpts.CPlusPlus23) {
CheckLiteralType(SemaRef, Kind, VD->getLocation(), VD->getType(),
diag::warn_cxx20_compat_constexpr_var,
- isa<CXXConstructorDecl>(Dcl),
- /*variable of non-literal type*/ 2);
+ isa<CXXConstructorDecl>(Dcl));
} else if (CheckLiteralType(
SemaRef, Kind, VD->getLocation(), VD->getType(),
diag::err_constexpr_local_var_non_literal_type,
@@ -2094,8 +2093,8 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
SemaRef.Diag(
VD->getLocation(),
SemaRef.getLangOpts().CPlusPlus20
- ? diag::warn_cxx17_compat_constexpr_local_var_no_init
- : diag::ext_constexpr_local_var_no_init)
+ ? diag::compat_cxx20_constexpr_local_var_no_init
+ : diag::compat_pre_cxx20_constexpr_local_var_no_init)
<< isa<CXXConstructorDecl>(Dcl);
} else if (!SemaRef.getLangOpts().CPlusPlus20) {
return false;
@@ -2106,8 +2105,8 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
if (Kind == Sema::CheckConstexprKind::Diagnose) {
SemaRef.Diag(VD->getLocation(),
SemaRef.getLangOpts().CPlusPlus14
- ? diag::warn_cxx11_compat_constexpr_local_var
- : diag::ext_constexpr_local_var)
+ ? diag::compat_cxx14_constexpr_local_var
+ : diag::compat_pre_cxx14_constexpr_local_var)
<< isa<CXXConstructorDecl>(Dcl);
} else if (!SemaRef.getLangOpts().CPlusPlus14) {
return false;
@@ -2179,8 +2178,8 @@ static bool CheckConstexprCtorInitializer(Sema &SemaRef,
if (!Diagnosed) {
SemaRef.Diag(Dcl->getLocation(),
SemaRef.getLangOpts().CPlusPlus20
- ? diag::warn_cxx17_compat_constexpr_ctor_missing_init
- : diag::ext_constexpr_ctor_missing_init);
+ ? diag::compat_cxx20_constexpr_ctor_missing_init
+ : diag::compat_pre_cxx20_constexpr_ctor_missing_init);
Diagnosed = true;
}
SemaRef.Diag(Field->getLocation(),
@@ -2392,9 +2391,9 @@ static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
case Sema::CheckConstexprKind::Diagnose:
SemaRef.Diag(Body->getBeginLoc(),
- !SemaRef.getLangOpts().CPlusPlus20
- ? diag::ext_constexpr_function_try_block_cxx20
- : diag::warn_cxx17_compat_constexpr_function_try_block)
+ SemaRef.getLangOpts().CPlusPlus20
+ ? diag::compat_cxx20_constexpr_function_try_block
+ : diag::compat_pre_cxx20_constexpr_function_try_block)
<< isa<CXXConstructorDecl>(Dcl);
break;
}
@@ -2423,20 +2422,20 @@ static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
} else if (Cxx2bLoc.isValid()) {
SemaRef.Diag(Cxx2bLoc,
SemaRef.getLangOpts().CPlusPlus23
- ? diag::warn_cxx20_compat_constexpr_body_invalid_stmt
- : diag::ext_constexpr_body_invalid_stmt_cxx23)
+ ? diag::compat_cxx23_constexpr_body_invalid_stmt
+ : diag::compat_pre_cxx23_constexpr_body_invalid_stmt)
<< isa<CXXConstructorDecl>(Dcl);
} else if (Cxx2aLoc.isValid()) {
SemaRef.Diag(Cxx2aLoc,
SemaRef.getLangOpts().CPlusPlus20
- ? diag::warn_cxx17_compat_constexpr_body_invalid_stmt
- : diag::ext_constexpr_body_invalid_stmt_cxx20)
+ ? diag::compat_cxx20_constexpr_body_invalid_stmt
+ : diag::compat_pre_cxx20_constexpr_body_invalid_stmt)
<< isa<CXXConstructorDecl>(Dcl);
} else if (Cxx1yLoc.isValid()) {
SemaRef.Diag(Cxx1yLoc,
SemaRef.getLangOpts().CPlusPlus14
- ? diag::warn_cxx11_compat_constexpr_body_invalid_stmt
- : diag::ext_constexpr_body_invalid_stmt)
+ ? diag::compat_cxx14_constexpr_body_invalid_stmt
+ : diag::compat_pre_cxx14_constexpr_body_invalid_stmt)
<< isa<CXXConstructorDecl>(Dcl);
}
@@ -2456,8 +2455,8 @@ static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
SemaRef.Diag(
Dcl->getLocation(),
SemaRef.getLangOpts().CPlusPlus20
- ? diag::warn_cxx17_compat_constexpr_union_ctor_no_init
- : diag::ext_constexpr_union_ctor_no_init);
+ ? diag::compat_cxx20_constexpr_union_ctor_no_init
+ : diag::compat_pre_cxx20_constexpr_union_ctor_no_init);
} else if (!SemaRef.getLangOpts().CPlusPlus20) {
return false;
}
@@ -2523,8 +2522,8 @@ static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
SemaRef.Diag(
ReturnStmts.back(),
SemaRef.getLangOpts().CPlusPlus14
- ? diag::warn_cxx11_compat_constexpr_body_multiple_return
- : diag::ext_constexpr_body_multiple_return);
+ ? diag::compat_cxx14_constexpr_body_multiple_return
+ : diag::compat_pre_cxx14_constexpr_body_multiple_return);
for (unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
SemaRef.Diag(ReturnStmts[I],
diag::note_constexpr_body_previous_return);
@@ -17825,8 +17824,8 @@ Decl *Sema::ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS,
InsertionText);
} else {
Diag(FriendLoc, getLangOpts().CPlusPlus11
- ? diag::warn_cxx98_compat_nonclass_type_friend
- : diag::ext_nonclass_type_friend)
+ ? diag::compat_cxx11_nonclass_type_friend
+ : diag::compat_pre_cxx11_nonclass_type_friend)
<< T << DS.getSourceRange();
}
}
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index a03acb5fbd273..7c666fb94bd53 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -6484,8 +6484,8 @@ ExprResult Sema::ActOnCallExpr(Scope *Scope, Expr *Fn, SourceLocation LParenLoc,
ULE && ULE->hasExplicitTemplateArgs() &&
ULE->decls_begin() == ULE->decls_end()) {
Diag(Fn->getExprLoc(), getLangOpts().CPlusPlus20
- ? diag::warn_cxx17_compat_adl_only_template_id
- : diag::ext_adl_only_template_id)
+ ? diag::compat_cxx20_adl_only_template_id
+ : diag::compat_pre_cxx20_adl_only_template_id)
<< ULE->getName();
}
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index c3c993d51b79d..b56572c7cae42 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -2235,10 +2235,11 @@ static bool DiagnoseDefaultTemplateArgument(Sema &S,
// template-argument, that declaration shall be a definition and shall be
// the only declaration of the function template in the translation unit.
// (C++98/03 doesn't have this wording; see DR226).
- S.Diag(ParamLoc, S.getLangOpts().CPlusPlus11 ?
- diag::warn_cxx98_compat_template_parameter_default_in_function_template
- : diag::ext_template_parameter_default_in_function_template)
- << DefArgRange;
+ S.Diag(ParamLoc,
+ S.getLangOpts().CPlusPlus11
+ ? diag::compat_cxx11_templ_default_in_function_templ
+ : diag::compat_pre_cxx11_templ_default_in_function_templ)
+ << DefArgRange;
return false;
case Sema::TPC_ClassTemplateMember:
@@ -6428,8 +6429,8 @@ static bool CheckTemplateArgumentAddressOfObjectOrFunction(
if (!Invalid && !ExtraParens) {
S.Diag(Arg->getBeginLoc(),
S.getLangOpts().CPlusPlus11
- ? diag::warn_cxx98_compat_template_arg_extra_parens
- : diag::ext_template_arg_extra_parens)
+ ? diag::compat_cxx11_template_arg_extra_parens
+ : diag::compat_pre_cxx11_template_arg_extra_parens)
<< Arg->getSourceRange();
ExtraParens = true;
}
@@ -6651,8 +6652,8 @@ CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param,
if (!Invalid && !ExtraParens) {
S.Diag(Arg->getBeginLoc(),
S.getLangOpts().CPlusPlus11
- ? diag::warn_cxx98_compat_template_arg_extra_parens
- : diag::ext_template_arg_extra_parens)
+ ? diag::compat_cxx11_template_arg_extra_parens
+ : diag::compat_pre_cxx11_template_arg_extra_parens)
<< Arg->getSourceRange();
ExtraParens = true;
}
@@ -10636,8 +10637,8 @@ TypeResult Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
if (TypenameLoc.isValid() && S && !S->getTemplateParamParent())
Diag(TypenameLoc,
getLangOpts().CPlusPlus11 ?
- diag::warn_cxx98_compat_typename_outside_of_template :
- diag::ext_typename_outside_of_template)
+ diag::compat_cxx11_typename_outside_of_template :
+ diag::compat_pre_cxx11_typename_outside_of_template)
<< FixItHint::CreateRemoval(TypenameLoc);
NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
@@ -10664,8 +10665,8 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
if (TypenameLoc.isValid() && S && !S->getTemplateParamParent())
Diag(TypenameLoc,
getLangOpts().CPlusPlus11 ?
- diag::warn_cxx98_compat_typename_outside_of_template :
- diag::ext_typename_outside_of_template)
+ diag::compat_cxx11_typename_outside_of_template :
+ diag::compat_pre_cxx11_typename_outside_of_template)
<< FixItHint::CreateRemoval(TypenameLoc);
// Strangely, non-type results are not ignored by this lookup, so the
diff --git a/clang/test/AST/ByteCode/if.cpp b/clang/test/AST/ByteCode/if.cpp
index 909e08a22a283..ad87b64fec468 100644
--- a/clang/test/AST/ByteCode/if.cpp
+++ b/clang/test/AST/ByteCode/if.cpp
@@ -54,7 +54,7 @@ namespace InitDecl {
constexpr char g(char const (&x)[2]) {
return 'x';
if (auto [a, b] = x) // both-error {{an array type is not allowed here}} \
- // both-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ // both-warning {{structured binding declaration in a condition is a C++2c extension}}
;
}
static_assert(g("x") == 'x');
diff --git a/clang/test/CXX/drs/cwg13xx.cpp b/clang/test/CXX/drs/cwg13xx.cpp
index 9c72fefb5b65c..2501a10846129 100644
--- a/clang/test/CXX/drs/cwg13xx.cpp
+++ b/clang/test/CXX/drs/cwg13xx.cpp
@@ -81,14 +81,14 @@ namespace cwg1310 { // cwg1310: 5
W<int>::W<int>::X w1bx;
typename W<int>::W w2a;
// expected-error at -1 {{ISO C++ specifies that qualified reference to 'W' is a constructor name rather than a type in this context, despite preceding 'typename' keyword}}
- // cxx98-error at -2 {{'typename' occurs outside of a template}}
+ // cxx98-error at -2 {{'typename' outside of a template is a C++11 extension}}
typename W<int>::W::X w2ax;
- // cxx98-error at -1 {{'typename' occurs outside of a template}}
+ // cxx98-error at -1 {{'typename' outside of a template is a C++11 extension}}
typename W<int>::W<int> w2b;
// expected-error at -1 {{ISO C++ specifies that qualified reference to 'W' is a constructor name rather than a template name in this context, despite preceding 'typename' keyword}}
- // cxx98-error at -2 {{'typename' occurs outside of a template}}
+ // cxx98-error at -2 {{'typename' outside of a template is a C++11 extension}}
typename W<int>::W<int>::X w2bx;
- // cxx98-error at -1 {{'typename' occurs outside of a template}}
+ // cxx98-error at -1 {{'typename' outside of a template is a C++11 extension}}
W<int>::template W<int> w3;
// expected-error at -1 {{ISO C++ specifies that qualified reference to 'W' is a constructor name rather than a template name in this context, despite preceding 'template' keyword}}
// cxx98-error at -2 {{'template' keyword outside of a template}}
@@ -97,10 +97,10 @@ namespace cwg1310 { // cwg1310: 5
typename W<int>::template W<int> w4;
// expected-error at -1 {{ISO C++ specifies that qualified reference to 'W' is a constructor name rather than a template name in this context, despite preceding 'template' keyword}}
// cxx98-error at -2 {{'template' keyword outside of a template}}
- // cxx98-error at -3 {{'typename' occurs outside of a template}}
+ // cxx98-error at -3 {{'typename' outside of a template is a C++11 extension}}
typename W<int>::template W<int>::X w4x;
// cxx98-error at -1 {{'template' keyword outside of a template}}
- // cxx98-error at -2 {{'typename' occurs outside of a template}}
+ // cxx98-error at -2 {{'typename' outside of a template is a C++11 extension}}
TT<W<int>::W> tt1;
// expected-error at -1 {{qualified reference to 'W' is a constructor name rather than a type in this context}}
diff --git a/clang/test/CXX/drs/cwg1xx.cpp b/clang/test/CXX/drs/cwg1xx.cpp
index 4a5394be146bc..6b9ad31bffbcd 100644
--- a/clang/test/CXX/drs/cwg1xx.cpp
+++ b/clang/test/CXX/drs/cwg1xx.cpp
@@ -1295,7 +1295,7 @@ namespace cwg183 { // cwg183: sup 382
};
template<> struct A<int> {
typename B<int>::X x;
- // cxx98-error at -1 {{'typename' occurs outside of a template}}
+ // cxx98-error at -1 {{'typename' outside of a template is a C++11 extension}}
};
} // namespace cwg183
diff --git a/clang/test/CXX/drs/cwg3xx.cpp b/clang/test/CXX/drs/cwg3xx.cpp
index 164cc26ae585a..8b035cf6f2370 100644
--- a/clang/test/CXX/drs/cwg3xx.cpp
+++ b/clang/test/CXX/drs/cwg3xx.cpp
@@ -1333,9 +1333,9 @@ namespace cwg382 { // cwg382: 2.7 c++11
// FIXME: Should we allow this in C++98 mode?
struct A { typedef int T; };
typename A::T t;
- // cxx98-error at -1 {{'typename' occurs outside of a template}}
+ // cxx98-error at -1 {{'typename' outside of a template is a C++11 extension}}
typename cwg382::A a;
- // cxx98-error at -1 {{'typename' occurs outside of a template}}
+ // cxx98-error at -1 {{'typename' outside of a template is a C++11 extension}}
typename A b;
// expected-error at -1 {{expected a qualified name after 'typename'}}
} // namespace cwg382
diff --git a/clang/test/CXX/temp/temp.arg/temp.arg.nontype/p5.cpp b/clang/test/CXX/temp/temp.arg/temp.arg.nontype/p5.cpp
index 034ad49d0715c..15b7a40654cd7 100644
--- a/clang/test/CXX/temp/temp.arg/temp.arg.nontype/p5.cpp
+++ b/clang/test/CXX/temp/temp.arg/temp.arg.nontype/p5.cpp
@@ -64,7 +64,7 @@ namespace pointer_to_object_parameters {
A2<&an_X> *a13_2;
A2<(&an_X)> *a13_3;
#if __cplusplus < 201103L
- // expected-warning at -2 {{address non-type template argument cannot be surrounded by parentheses}}
+ // expected-warning at -2 {{parentheses around address non-type template argument are a C++11 extension}}
#endif
// PR6244
diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c
index 46b4e5a064c36..a978835a41014 100644
--- a/clang/test/Misc/warning-flags.c
+++ b/clang/test/Misc/warning-flags.c
@@ -18,13 +18,12 @@ This test serves two purposes:
The list of warnings below should NEVER grow. It should gradually shrink to 0.
-CHECK: Warnings without flags (59):
+CHECK: Warnings without flags (58):
CHECK-NEXT: ext_expected_semi_decl_list
CHECK-NEXT: ext_missing_whitespace_after_macro_name
CHECK-NEXT: ext_new_paren_array_nonconst
CHECK-NEXT: ext_plain_complex
-CHECK-NEXT: ext_template_arg_extra_parens
CHECK-NEXT: ext_typecheck_cond_incompatible_operands
CHECK-NEXT: ext_typecheck_ordered_comparison_of_pointer_integer
CHECK-NEXT: ext_using_undefined_std
diff --git a/clang/test/Parser/cxx1z-decomposition.cpp b/clang/test/Parser/cxx1z-decomposition.cpp
index a6ca642269eee..3e2526979be8b 100644
--- a/clang/test/Parser/cxx1z-decomposition.cpp
+++ b/clang/test/Parser/cxx1z-decomposition.cpp
@@ -37,12 +37,12 @@ namespace OtherDecl {
void g() {
// A condition is allowed as a Clang extension.
// See commentary in test/Parser/decomposed-condition.cpp
- for (; auto [a, b, c] = S(); ) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
- if (auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
- if (int n; auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
- switch (auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{statement requires expression of integer type ('S' invalid)}}
- switch (int n; auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{statement requires expression of integer type ('S' invalid)}}
- while (auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
+ for (; auto [a, b, c] = S(); ) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
+ if (auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
+ if (int n; auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
+ switch (auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{statement requires expression of integer type ('S' invalid)}}
+ switch (int n; auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{statement requires expression of integer type ('S' invalid)}}
+ while (auto [a, b, c] = S()) {} // pre2c-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'S' is not contextually convertible to 'bool'}}
// An exception-declaration is not a simple-declaration.
try {}
diff --git a/clang/test/Parser/decomposed-condition.cpp b/clang/test/Parser/decomposed-condition.cpp
index 37a24f8f95093..15a9da7d32004 100644
--- a/clang/test/Parser/decomposed-condition.cpp
+++ b/clang/test/Parser/decomposed-condition.cpp
@@ -33,33 +33,33 @@ Na g();
namespace CondInIf {
int h() {
- if (auto [ok, d] = f()) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ if (auto [ok, d] = f()) // expected-warning {{structured binding declaration in a condition is a C++2c extension}}
;
- if (auto [ok, d] = g()) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
+ if (auto [ok, d] = g()) // expected-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
;
- if (auto [value] = Get()) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ if (auto [value] = Get()) // expected-warning {{structured binding declaration in a condition is a C++2c extension}}
return value;
}
} // namespace CondInIf
namespace CondInWhile {
int h() {
- while (auto [ok, d] = f()) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ while (auto [ok, d] = f()) // expected-warning {{structured binding declaration in a condition is a C++2c extension}}
;
- while (auto [ok, d] = g()) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
+ while (auto [ok, d] = g()) // expected-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
;
- while (auto [value] = Get()) // expected-warning{{structured binding declaration in a condition is a C++2c extenstion}}
+ while (auto [value] = Get()) // expected-warning{{structured binding declaration in a condition is a C++2c extension}}
return value;
}
} // namespace CondInWhile
namespace CondInFor {
int h() {
- for (; auto [ok, d] = f();) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ for (; auto [ok, d] = f();) // expected-warning {{structured binding declaration in a condition is a C++2c extension}}
;
- for (; auto [ok, d] = g();) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
+ for (; auto [ok, d] = g();) // expected-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{value of type 'Na' is not contextually convertible to 'bool'}}
;
- for (; auto [value] = Get();) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ for (; auto [value] = Get();) // expected-warning {{structured binding declaration in a condition is a C++2c extension}}
return value;
}
} // namespace CondInFor
@@ -74,11 +74,11 @@ struct IntegerLike {
namespace CondInSwitch {
int h(IntegerLike x) {
- switch (auto [ok, d] = x) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ switch (auto [ok, d] = x) // expected-warning {{structured binding declaration in a condition is a C++2c extension}}
;
- switch (auto [ok, d] = g()) // expected-warning {{structured binding declaration in a condition is a C++2c extenstion}} expected-error {{statement requires expression of integer type ('Na' invalid)}}
+ switch (auto [ok, d] = g()) // expected-warning {{structured binding declaration in a condition is a C++2c extension}} expected-error {{statement requires expression of integer type ('Na' invalid)}}
;
- switch (auto [value] = Get()) {// expected-warning {{structured binding declaration in a condition is a C++2c extenstion}}
+ switch (auto [value] = Get()) {// expected-warning {{structured binding declaration in a condition is a C++2c extension}}
// expected-warning at -1{{switch condition has boolean value}}
case 1:
return value;
diff --git a/clang/test/SemaCXX/cxx98-compat.cpp b/clang/test/SemaCXX/cxx98-compat.cpp
index d31d95a9995f1..43ba208d375cd 100644
--- a/clang/test/SemaCXX/cxx98-compat.cpp
+++ b/clang/test/SemaCXX/cxx98-compat.cpp
@@ -189,8 +189,8 @@ int UnnamedTemplateArg = TemplateFn(obj_of_unnamed_type); // expected-warning {{
namespace RedundantParensInAddressTemplateParam {
int n;
template<int*p> struct S {};
- S<(&n)> s; // expected-warning {{redundant parentheses surrounding address non-type template argument are incompatible with C++98}}
- S<(((&n)))> t; // expected-warning {{redundant parentheses surrounding address non-type template argument are incompatible with C++98}}
+ S<(&n)> s; // expected-warning {{parentheses around address non-type template argument are incompatible with C++98}}
+ S<(((&n)))> t; // expected-warning {{parentheses around address non-type template argument are incompatible with C++98}}
}
#endif
@@ -202,7 +202,7 @@ template<> struct TemplateSpecOutOfScopeNs::S<char> {};
struct Typename {
template<typename T> struct Inner {};
};
-typename ::Typename TypenameOutsideTemplate(); // expected-warning {{use of 'typename' outside of a template is incompatible with C++98}}
+typename ::Typename TypenameOutsideTemplate(); // expected-warning {{'typename' outside of a template is incompatible with C++98}}
Typename::template Inner<int> TemplateOutsideTemplate(); // expected-warning {{use of 'template' keyword outside of a template is incompatible with C++98}}
struct TrivialButNonPOD {
diff --git a/clang/test/SemaObjCXX/message.mm b/clang/test/SemaObjCXX/message.mm
index ec82d63ea908b..5c37135f1a59c 100644
--- a/clang/test/SemaObjCXX/message.mm
+++ b/clang/test/SemaObjCXX/message.mm
@@ -67,7 +67,7 @@ + (int *)otherMethod {
if (true)
return [typename identity<I3>::type method];
#if __cplusplus <= 199711L
- // expected-warning at -2 {{'typename' occurs outside of a template}}
+ // expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
return [::I3 method];
@@ -77,12 +77,12 @@ + (int *)otherMethod {
int* ip2 = {[::I3 method]};
int* ip3 = {[typename identity<I3>::type method]};
#if __cplusplus <= 199711L
- // expected-warning at -2 {{'typename' occurs outside of a template}}
+ // expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
int* ip4 = {[typename identity<I2_holder>::type().get() method]};
#if __cplusplus <= 199711L
- // expected-warning at -2 {{'typename' occurs outside of a template}}
+ // expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
int array[5] = {[3] = 2}; // expected-warning {{C99 extension}}
return [super method];
diff --git a/clang/test/SemaTemplate/temp_arg_nontype.cpp b/clang/test/SemaTemplate/temp_arg_nontype.cpp
index 2a1c059df002e..e989e45efb687 100644
--- a/clang/test/SemaTemplate/temp_arg_nontype.cpp
+++ b/clang/test/SemaTemplate/temp_arg_nontype.cpp
@@ -90,7 +90,7 @@ template<int Z::*pm> struct A7c;
A7<&Z::int_member> *a18_1;
A7c<&Z::int_member> *a18_2;
A7<&Z::float_member> *a18_3; // expected-error{{non-type template argument of type 'float Z::*' cannot be converted to a value of type 'int Z::*'}}
-A7c<(&Z::int_member)> *a18_4; // expected-warning{{address non-type template argument cannot be surrounded by parentheses}}
+A7c<(&Z::int_member)> *a18_4; // expected-warning{{parentheses around address non-type template argument are a C++11 extension}}
A7c<&Z::union_member> *a18_5;
template<unsigned char C> struct Overflow; // expected-note{{template parameter is declared here}}
diff --git a/clang/test/SemaTemplate/typename-specifier-4.cpp b/clang/test/SemaTemplate/typename-specifier-4.cpp
index 7aa2b8da51081..4853e610e2ba6 100644
--- a/clang/test/SemaTemplate/typename-specifier-4.cpp
+++ b/clang/test/SemaTemplate/typename-specifier-4.cpp
@@ -32,7 +32,7 @@ int a1[is_same<
typename make_pair::template apply<int, float>,
#if __cplusplus <= 199711L // C++03 and earlier modes
// expected-warning at -2 {{'template' keyword outside of a template}}
- // expected-warning at -3 {{'typename' occurs outside of a template}}
+ // expected-warning at -3 {{'typename' outside of a template is a C++11 extension}}
#endif
make_pair::apply<int, float>
>::value? 1 : -1];
diff --git a/clang/test/SemaTemplate/typename-specifier.cpp b/clang/test/SemaTemplate/typename-specifier.cpp
index 99326f6a400ad..01acc34f3bb37 100644
--- a/clang/test/SemaTemplate/typename-specifier.cpp
+++ b/clang/test/SemaTemplate/typename-specifier.cpp
@@ -22,35 +22,35 @@ int i;
typename N::A::type *ip1 = &i;
#if __cplusplus <= 199711L // C++03 or earlier modes
-// expected-warning at -2 {{'typename' occurs outside of a template}}
+// expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
typename N::B::type *ip2 = &i; // expected-error{{no type named 'type' in 'N::B'}}
#if __cplusplus <= 199711L
-// expected-warning at -2 {{'typename' occurs outside of a template}}
+// expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
typename N::C::type *ip3 = &i; // expected-error{{typename specifier refers to non-type member 'type'}}
#if __cplusplus <= 199711L
-// expected-warning at -2 {{'typename' occurs outside of a template}}
+// expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
void test(double d) {
typename N::A::type f(typename N::A::type(a)); // expected-warning{{disambiguated as a function declaration}}
// expected-note at -1 {{add a pair of parentheses}}
#if __cplusplus <= 199711L
- // expected-warning at -3 2{{'typename' occurs outside of a template}}
+ // expected-warning at -3 2{{'typename' outside of a template is a C++11 extension}}
#endif
int five = f(5);
using namespace N;
for (typename A::type i = 0; i < 10; ++i)
#if __cplusplus <= 199711L
-// expected-warning at -2 {{'typename' occurs outside of a template}}
+// expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
five += 1;
const typename N::A::type f2(d);
#if __cplusplus <= 199711L
-// expected-warning at -2 {{'typename' occurs outside of a template}}
+// expected-warning at -2 {{'typename' outside of a template is a C++11 extension}}
#endif
}
>From 1237a15001e81b12c22a19855462781109dd06b5 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 02:13:24 +0100
Subject: [PATCH 3/7] clang-format
---
clang/lib/Sema/SemaDeclCXX.cpp | 27 ++++++++++++++-------------
clang/lib/Sema/SemaTemplate.cpp | 18 ++++++++----------
2 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 753beeb3c5349..15b49ff2aee99 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -747,8 +747,9 @@ Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D,
if (!getLangOpts().CPlusPlus17)
DiagID = diag::compat_pre_cxx17_decomp_decl;
else if (D.getContext() == DeclaratorContext::Condition)
- DiagID = getLangOpts().CPlusPlus26 ? diag::compat_cxx26_decomp_decl_cond
- : diag::compat_pre_cxx26_decomp_decl_cond;
+ DiagID = getLangOpts().CPlusPlus26
+ ? diag::compat_cxx26_decomp_decl_cond
+ : diag::compat_pre_cxx26_decomp_decl_cond;
else
DiagID = diag::compat_cxx17_decomp_decl;
@@ -2105,9 +2106,9 @@ static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
if (Kind == Sema::CheckConstexprKind::Diagnose) {
SemaRef.Diag(VD->getLocation(),
SemaRef.getLangOpts().CPlusPlus14
- ? diag::compat_cxx14_constexpr_local_var
- : diag::compat_pre_cxx14_constexpr_local_var)
- << isa<CXXConstructorDecl>(Dcl);
+ ? diag::compat_cxx14_constexpr_local_var
+ : diag::compat_pre_cxx14_constexpr_local_var)
+ << isa<CXXConstructorDecl>(Dcl);
} else if (!SemaRef.getLangOpts().CPlusPlus14) {
return false;
}
@@ -2427,16 +2428,16 @@ static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
<< isa<CXXConstructorDecl>(Dcl);
} else if (Cxx2aLoc.isValid()) {
SemaRef.Diag(Cxx2aLoc,
- SemaRef.getLangOpts().CPlusPlus20
- ? diag::compat_cxx20_constexpr_body_invalid_stmt
- : diag::compat_pre_cxx20_constexpr_body_invalid_stmt)
- << isa<CXXConstructorDecl>(Dcl);
+ SemaRef.getLangOpts().CPlusPlus20
+ ? diag::compat_cxx20_constexpr_body_invalid_stmt
+ : diag::compat_pre_cxx20_constexpr_body_invalid_stmt)
+ << isa<CXXConstructorDecl>(Dcl);
} else if (Cxx1yLoc.isValid()) {
SemaRef.Diag(Cxx1yLoc,
- SemaRef.getLangOpts().CPlusPlus14
- ? diag::compat_cxx14_constexpr_body_invalid_stmt
- : diag::compat_pre_cxx14_constexpr_body_invalid_stmt)
- << isa<CXXConstructorDecl>(Dcl);
+ SemaRef.getLangOpts().CPlusPlus14
+ ? diag::compat_cxx14_constexpr_body_invalid_stmt
+ : diag::compat_pre_cxx14_constexpr_body_invalid_stmt)
+ << isa<CXXConstructorDecl>(Dcl);
}
if (const CXXConstructorDecl *Constructor
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index b56572c7cae42..97da433b8ddbc 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -10635,11 +10635,10 @@ TypeResult Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
return true;
if (TypenameLoc.isValid() && S && !S->getTemplateParamParent())
- Diag(TypenameLoc,
- getLangOpts().CPlusPlus11 ?
- diag::compat_cxx11_typename_outside_of_template :
- diag::compat_pre_cxx11_typename_outside_of_template)
- << FixItHint::CreateRemoval(TypenameLoc);
+ Diag(TypenameLoc, getLangOpts().CPlusPlus11
+ ? diag::compat_cxx11_typename_outside_of_template
+ : diag::compat_pre_cxx11_typename_outside_of_template)
+ << FixItHint::CreateRemoval(TypenameLoc);
NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
TypeSourceInfo *TSI = nullptr;
@@ -10663,11 +10662,10 @@ Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc,
ASTTemplateArgsPtr TemplateArgsIn,
SourceLocation RAngleLoc) {
if (TypenameLoc.isValid() && S && !S->getTemplateParamParent())
- Diag(TypenameLoc,
- getLangOpts().CPlusPlus11 ?
- diag::compat_cxx11_typename_outside_of_template :
- diag::compat_pre_cxx11_typename_outside_of_template)
- << FixItHint::CreateRemoval(TypenameLoc);
+ Diag(TypenameLoc, getLangOpts().CPlusPlus11
+ ? diag::compat_cxx11_typename_outside_of_template
+ : diag::compat_pre_cxx11_typename_outside_of_template)
+ << FixItHint::CreateRemoval(TypenameLoc);
// Strangely, non-type results are not ignored by this lookup, so the
// program is ill-formed if it finds an injected-class-name.
>From 230528403f934619e3b97f37c58cc0006fd391a0 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 02:18:36 +0100
Subject: [PATCH 4/7] Shorten 'CompatWarn' to just 'Compat'
---
clang/include/clang/Basic/Diagnostic.td | 26 ++++++------
.../clang/Basic/DiagnosticSemaKinds.td | 40 +++++++++----------
2 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/clang/include/clang/Basic/Diagnostic.td b/clang/include/clang/Basic/Diagnostic.td
index 85b7276695613..26ac50f391d78 100644
--- a/clang/include/clang/Basic/Diagnostic.td
+++ b/clang/include/clang/Basic/Diagnostic.td
@@ -156,7 +156,7 @@ class DefaultWarnNoWerror {
class DefaultRemark { Severity DefaultSeverity = SEV_Remark; }
// C++ compatibility warnings
-multiclass CXXCompatWarn<
+multiclass CXXCompat<
string message,
bit default_ignore,
int std_ver,
@@ -180,23 +180,23 @@ multiclass CXXCompatWarn<
DefaultIgnore;
}
-multiclass CXX11CompatWarn<string message, bit default_ignore = false>
- : CXXCompatWarn<message, default_ignore, 11>;
+multiclass CXX11Compat<string message, bit default_ignore = false>
+ : CXXCompat<message, default_ignore, 11>;
-multiclass CXX14CompatWarn<string message, bit default_ignore = false>
- : CXXCompatWarn<message, default_ignore, 14>;
+multiclass CXX14Compat<string message, bit default_ignore = false>
+ : CXXCompat<message, default_ignore, 14>;
-multiclass CXX17CompatWarn<string message, bit default_ignore = false>
- : CXXCompatWarn<message, default_ignore, 17>;
+multiclass CXX17Compat<string message, bit default_ignore = false>
+ : CXXCompat<message, default_ignore, 17>;
-multiclass CXX20CompatWarn<string message, bit default_ignore = false>
- : CXXCompatWarn<message, default_ignore, 20>;
+multiclass CXX20Compat<string message, bit default_ignore = false>
+ : CXXCompat<message, default_ignore, 20>;
-multiclass CXX23CompatWarn<string message, bit default_ignore = false>
- : CXXCompatWarn<message, default_ignore, 23>;
+multiclass CXX23Compat<string message, bit default_ignore = false>
+ : CXXCompat<message, default_ignore, 23>;
-multiclass CXX26CompatWarn<string message, bit default_ignore = false>
- : CXXCompatWarn<message, default_ignore, 26, "2c">;
+multiclass CXX26Compat<string message, bit default_ignore = false>
+ : CXXCompat<message, default_ignore, 26, "2c">;
// Definitions for Diagnostics.
include "DiagnosticASTKinds.td"
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 4ef1ab0ca4470..f5dfd0cfa419d 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -13,55 +13,55 @@
let Component = "Sema" in {
let CategoryName = "Semantic Issue" in {
// C++11 compatibility with C++98.
-defm nonclass_type_friend : CXX11CompatWarn<"non-class friend type %0 is">;
-defm static_data_member_in_union : CXX11CompatWarn<"static data member %0 in union is">;
-defm templ_default_in_function_templ : CXX11CompatWarn<
+defm nonclass_type_friend : CXX11Compat<"non-class friend type %0 is">;
+defm static_data_member_in_union : CXX11Compat<"static data member %0 in union is">;
+defm templ_default_in_function_templ : CXX11Compat<
"default template arguments for a function template are">;
-defm template_arg_extra_parens : CXX11CompatWarn<
+defm template_arg_extra_parens : CXX11Compat<
"parentheses around address non-type template argument are">;
-defm typename_outside_of_template : CXX11CompatWarn<"'typename' outside of a template is">;
+defm typename_outside_of_template : CXX11Compat<"'typename' outside of a template is">;
// C++14 compatibility with C++11 and earlier.
-defm constexpr_type_definition : CXX14CompatWarn<
+defm constexpr_type_definition : CXX14Compat<
"type definition in a constexpr %select{function|constructor}0 is">;
-defm constexpr_local_var : CXX14CompatWarn<
+defm constexpr_local_var : CXX14Compat<
"variable declaration in a constexpr %select{function|constructor}0 is">;
-defm constexpr_body_multiple_return : CXX14CompatWarn<
+defm constexpr_body_multiple_return : CXX14Compat<
"multiple return statements in constexpr function is">;
-defm variable_template : CXX14CompatWarn<"variable templates are">;
+defm variable_template : CXX14Compat<"variable templates are">;
// C++17 compatibility with C++14 and earlier.
-defm decomp_decl : CXX17CompatWarn<"decomposition declarations are">;
-defm inline_variable : CXX17CompatWarn<"inline variables are">;
+defm decomp_decl : CXX17Compat<"decomposition declarations are">;
+defm inline_variable : CXX17Compat<"inline variables are">;
// C++20 compatibility with C++17 and earlier.
-defm decomp_decl_spec : CXX20CompatWarn<
+defm decomp_decl_spec : CXX20Compat<
"decomposition declaration declared "
"%plural{1:'%1'|:with '%1' specifiers}0 is">;
-defm constexpr_local_var_no_init : CXX20CompatWarn<
+defm constexpr_local_var_no_init : CXX20Compat<
"uninitialized variable in a constexpr %select{function|constructor}0 is">;
-defm constexpr_function_try_block : CXX20CompatWarn<
+defm constexpr_function_try_block : CXX20Compat<
"function try block in constexpr %select{function|constructor}0 is">;
-defm constexpr_union_ctor_no_init : CXX20CompatWarn<
+defm constexpr_union_ctor_no_init : CXX20Compat<
"constexpr union constructor that does not initialize any member is">;
-defm constexpr_ctor_missing_init : CXX20CompatWarn<
+defm constexpr_ctor_missing_init : CXX20Compat<
"constexpr constructor that does not initialize all members is">;
-defm adl_only_template_id : CXX20CompatWarn<
+defm adl_only_template_id : CXX20Compat<
"use of function template name with no prior declaration in function call "
"with explicit template arguments is">;
// C++23 compatibility with C++20 and earlier.
-defm constexpr_static_var : CXX23CompatWarn<
+defm constexpr_static_var : CXX23Compat<
"definition of a %select{static|thread_local}1 variable "
"in a constexpr %select{function|constructor}0 "
"is">;
// C++26 compatibility with C++23 and earlier.
-defm decomp_decl_cond : CXX26CompatWarn<"structured binding declaration in a condition is">;
+defm decomp_decl_cond : CXX26Compat<"structured binding declaration in a condition is">;
// Compatibility warnings duplicated across multiple language versions.
foreach std = [14, 20, 23] in {
- defm constexpr_body_invalid_stmt : CXXCompatWarn<
+ defm constexpr_body_invalid_stmt : CXXCompat<
"use of this statement in a constexpr %select{function|constructor}0 is",
/*default_ignore=*/false,
std>;
>From ff090e2d64aa8e0a6f91ce264cdefe7ac9746199 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 02:25:00 +0100
Subject: [PATCH 5/7] Rename and reorder parameters
---
clang/include/clang/Basic/Diagnostic.td | 30 +++++++++----------
.../clang/Basic/DiagnosticSemaKinds.td | 4 +--
2 files changed, 16 insertions(+), 18 deletions(-)
diff --git a/clang/include/clang/Basic/Diagnostic.td b/clang/include/clang/Basic/Diagnostic.td
index 26ac50f391d78..f18aeee996f97 100644
--- a/clang/include/clang/Basic/Diagnostic.td
+++ b/clang/include/clang/Basic/Diagnostic.td
@@ -155,17 +155,17 @@ class DefaultWarnNoWerror {
}
class DefaultRemark { Severity DefaultSeverity = SEV_Remark; }
-// C++ compatibility warnings
+// C++ compatibility warnings.
multiclass CXXCompat<
string message,
- bit default_ignore,
int std_ver,
+ bit ext_warn = true,
string std_ver_override = ""#std_ver> {
// 'X is a C++YZ extension'.
def compat_pre_cxx#std_ver#_#NAME :
Diagnostic<!strconcat(message, " a C++", std_ver_override, " extension"),
CLASS_EXTENSION,
- !if(default_ignore, SEV_Ignored, SEV_Warning)>,
+ !if(ext_warn, SEV_Warning, SEV_Ignored)>,
InGroup<!cast<DiagGroup>("CXX"#std_ver)>;
// 'X is incompatible with C++98' (if std_ver == 11).
@@ -180,23 +180,23 @@ multiclass CXXCompat<
DefaultIgnore;
}
-multiclass CXX11Compat<string message, bit default_ignore = false>
- : CXXCompat<message, default_ignore, 11>;
+multiclass CXX11Compat<string message, bit ext_warn = true>
+ : CXXCompat<message, 11, ext_warn>;
-multiclass CXX14Compat<string message, bit default_ignore = false>
- : CXXCompat<message, default_ignore, 14>;
+multiclass CXX14Compat<string message, bit ext_warn = true>
+ : CXXCompat<message, 14, ext_warn>;
-multiclass CXX17Compat<string message, bit default_ignore = false>
- : CXXCompat<message, default_ignore, 17>;
+multiclass CXX17Compat<string message, bit ext_warn = true>
+ : CXXCompat<message, 17, ext_warn>;
-multiclass CXX20Compat<string message, bit default_ignore = false>
- : CXXCompat<message, default_ignore, 20>;
+multiclass CXX20Compat<string message, bit ext_warn = true>
+ : CXXCompat<message, 20, ext_warn>;
-multiclass CXX23Compat<string message, bit default_ignore = false>
- : CXXCompat<message, default_ignore, 23>;
+multiclass CXX23Compat<string message, bit ext_warn = true>
+ : CXXCompat<message, 23, ext_warn>;
-multiclass CXX26Compat<string message, bit default_ignore = false>
- : CXXCompat<message, default_ignore, 26, "2c">;
+multiclass CXX26Compat<string message, bit ext_warn = true>
+ : CXXCompat<message, 26, ext_warn, "2c">;
// Definitions for Diagnostics.
include "DiagnosticASTKinds.td"
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index f5dfd0cfa419d..eed06657536f4 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -62,9 +62,7 @@ defm decomp_decl_cond : CXX26Compat<"structured binding declaration in a conditi
// Compatibility warnings duplicated across multiple language versions.
foreach std = [14, 20, 23] in {
defm constexpr_body_invalid_stmt : CXXCompat<
- "use of this statement in a constexpr %select{function|constructor}0 is",
- /*default_ignore=*/false,
- std>;
+ "use of this statement in a constexpr %select{function|constructor}0 is", std>;
}
def note_previous_decl : Note<"%0 declared here">;
>From 5143d71867b8f6a0095b621d60df5d876b6c8adf Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 02:25:41 +0100
Subject: [PATCH 6/7] These are short enough to fit on one line now
---
clang/include/clang/Basic/Diagnostic.td | 23 ++++++-----------------
1 file changed, 6 insertions(+), 17 deletions(-)
diff --git a/clang/include/clang/Basic/Diagnostic.td b/clang/include/clang/Basic/Diagnostic.td
index f18aeee996f97..c3d3631f04530 100644
--- a/clang/include/clang/Basic/Diagnostic.td
+++ b/clang/include/clang/Basic/Diagnostic.td
@@ -180,23 +180,12 @@ multiclass CXXCompat<
DefaultIgnore;
}
-multiclass CXX11Compat<string message, bit ext_warn = true>
- : CXXCompat<message, 11, ext_warn>;
-
-multiclass CXX14Compat<string message, bit ext_warn = true>
- : CXXCompat<message, 14, ext_warn>;
-
-multiclass CXX17Compat<string message, bit ext_warn = true>
- : CXXCompat<message, 17, ext_warn>;
-
-multiclass CXX20Compat<string message, bit ext_warn = true>
- : CXXCompat<message, 20, ext_warn>;
-
-multiclass CXX23Compat<string message, bit ext_warn = true>
- : CXXCompat<message, 23, ext_warn>;
-
-multiclass CXX26Compat<string message, bit ext_warn = true>
- : CXXCompat<message, 26, ext_warn, "2c">;
+multiclass CXX11Compat<string message, bit ext_warn = true> : CXXCompat<message, 11, ext_warn>;
+multiclass CXX14Compat<string message, bit ext_warn = true> : CXXCompat<message, 14, ext_warn>;
+multiclass CXX17Compat<string message, bit ext_warn = true> : CXXCompat<message, 17, ext_warn>;
+multiclass CXX20Compat<string message, bit ext_warn = true> : CXXCompat<message, 20, ext_warn>;
+multiclass CXX23Compat<string message, bit ext_warn = true> : CXXCompat<message, 23, ext_warn>;
+multiclass CXX26Compat<string message, bit ext_warn = true> : CXXCompat<message, 26, ext_warn, "2c">;
// Definitions for Diagnostics.
include "DiagnosticASTKinds.td"
>From 895924e59d5367fde100938483496424720fe8f9 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Thu, 20 Mar 2025 17:51:28 +0100
Subject: [PATCH 7/7] Add comment
---
clang/include/clang/Basic/Diagnostic.td | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/clang/include/clang/Basic/Diagnostic.td b/clang/include/clang/Basic/Diagnostic.td
index c3d3631f04530..b31d846210a8e 100644
--- a/clang/include/clang/Basic/Diagnostic.td
+++ b/clang/include/clang/Basic/Diagnostic.td
@@ -180,6 +180,23 @@ multiclass CXXCompat<
DefaultIgnore;
}
+// These generate pairs of C++ compatibility warnings of the form:
+//
+// - compat_cxx<std>_<name>
+// - compat_pre_cxx<std>_<name>
+//
+// The 'compat_cxx...' warning is intended to be issued in C++<std> mode,
+// and the 'compat_pre_cxx...' warning in C++ modes before C++<std>.
+//
+// Example:
+//
+// defm inline_variable : CXX17Compat<"inline variables are">;
+//
+// This generates two warnings:
+//
+// - compat_cxx17_inline_variable: 'inline variables are incompatible with C++ standards before C++17'
+// - compat_pre_cxx17_inline_variable: 'inline variables are a C++17 extension'
+//
multiclass CXX11Compat<string message, bit ext_warn = true> : CXXCompat<message, 11, ext_warn>;
multiclass CXX14Compat<string message, bit ext_warn = true> : CXXCompat<message, 14, ext_warn>;
multiclass CXX17Compat<string message, bit ext_warn = true> : CXXCompat<message, 17, ext_warn>;
More information about the cfe-commits
mailing list