[clang] 559f07b - [Clang] Adjust extension warnings for #warning
Corentin Jabot via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 23 05:10:17 PDT 2022
Author: Corentin Jabot
Date: 2022-07-23T14:10:11+02:00
New Revision: 559f07b872116fb85ea7d493768a6eb450329fa0
URL: https://github.com/llvm/llvm-project/commit/559f07b872116fb85ea7d493768a6eb450329fa0
DIFF: https://github.com/llvm/llvm-project/commit/559f07b872116fb85ea7d493768a6eb450329fa0.diff
LOG: [Clang] Adjust extension warnings for #warning
The #warning directive is standard in C++2b and C2x,
this adjusts the pedantic and extensions warning accordingly.
Reviewed By: aaron.ballman
Differential Revision: https://reviews.llvm.org/D130415
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/DiagnosticLexKinds.td
clang/lib/Lex/PPDirectives.cpp
clang/test/Preprocessor/ext-pp-directive.c
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 7fb21dbadea0..6d6faa32e458 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -262,7 +262,7 @@ Improvements to Clang's diagnostics
- Added the ``-Wgnu-line-marker`` diagnostic flag (grouped under the ``-Wgnu``
flag) which is a portability warning about use of GNU linemarker preprocessor
directives. Fixes `Issue 55067 <https://github.com/llvm/llvm-project/issues/55067>`_.
-- Using ``#elifdef`` and ``#elifndef`` that are incompatible with C/C++
+- Using ``#warning``, ``#elifdef`` and ``#elifndef`` that are incompatible with C/C++
standards before C2x/C++2b are now warned via ``-pedantic``. Additionally,
on such language mode, ``-Wpre-c2x-compat`` and ``-Wpre-c++2b-compat``
diagnostic flags report a compatibility issue.
diff --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td
index 5d3abb1f9b70..6032fbd18d56 100644
--- a/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -387,7 +387,15 @@ def ext_pp_include_search_ms : ExtWarn<
def ext_pp_ident_directive : Extension<"#ident is a language extension">;
def ext_pp_include_next_directive : Extension<
"#include_next is a language extension">, InGroup<GNUIncludeNext>;
-def ext_pp_warning_directive : Extension<"#warning is a language extension">;
+
+def ext_pp_warning_directive : Extension<
+ "#warning is a %select{C2x|C++2b}0 extension">;
+def warn_cxx2b_compat_warning_directive : Warning<
+ "#warning is incompatible with C++ standards before C++2b">,
+ InGroup<CXXPre2bCompat>, DefaultIgnore;
+def warn_c2x_compat_warning_directive : Warning<
+ "#warning is incompatible with C standards before C2x">,
+ InGroup<CPre2xCompat>, DefaultIgnore;
def ext_pp_extra_tokens_at_eol : ExtWarn<
"extra tokens at end of #%0 directive">, InGroup<ExtraTokens>;
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 4679cb4e7a34..9a8fd4391b41 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -1261,7 +1261,16 @@ void Preprocessor::HandleDirective(Token &Result) {
return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
case tok::pp_warning:
- Diag(Result, diag::ext_pp_warning_directive);
+ if (LangOpts.CPlusPlus)
+ Diag(Result, LangOpts.CPlusPlus2b
+ ? diag::warn_cxx2b_compat_warning_directive
+ : diag::ext_pp_warning_directive)
+ << /*C++2b*/ 1;
+ else
+ Diag(Result, LangOpts.C2x ? diag::warn_c2x_compat_warning_directive
+ : diag::ext_pp_warning_directive)
+ << /*C2x*/ 0;
+
return HandleUserDiagnosticDirective(Result, true);
case tok::pp_ident:
return HandleIdentSCCSDirective(Result);
diff --git a/clang/test/Preprocessor/ext-pp-directive.c b/clang/test/Preprocessor/ext-pp-directive.c
index 45f7ecba3022..97454b4d9002 100644
--- a/clang/test/Preprocessor/ext-pp-directive.c
+++ b/clang/test/Preprocessor/ext-pp-directive.c
@@ -57,3 +57,16 @@ int x;
// For C++
// pre-cpp2b-pedantic-warning at -7 {{use of a '#elifndef' directive is a C++2b extension}}
// pre-cpp2b-compat-warning at -8 {{use of a '#elifndef' directive is incompatible with C++ standards before C++2b}}
+
+#warning foo
+// For C
+// pre-c2x-pedantic-warning at -2 {{#warning is a C2x extension}}
+// pre-c2x-pedantic-warning at -3 {{foo}}
+// pre-c2x-compat-warning at -4 {{#warning is incompatible with C standards before C2x}}
+// pre-c2x-compat-warning at -5 {{foo}}
+
+// For C++
+// pre-cpp2b-pedantic-warning at -8 {{#warning is a C++2b extension}}
+// pre-cpp2b-pedantic-warning at -9 {{foo}}
+// pre-cpp2b-compat-warning at -10 {{#warning is incompatible with C++ standards before C++2b}}
+// pre-cpp2b-compat-warning at -11 {{foo}}
More information about the cfe-commits
mailing list