diff options
author | Corentin Jabot <corentinjabot@gmail.com> | 2022-07-23 11:08:14 +0200 |
---|---|---|
committer | Corentin Jabot <corentinjabot@gmail.com> | 2022-07-23 14:10:11 +0200 |
commit | 559f07b872116fb85ea7d493768a6eb450329fa0 (patch) | |
tree | 66d6035268e7357b06909452b4d7b565f0d3a131 /clang | |
parent | [Clang] Add support for Unicode identifiers (UAX31) in C2x mode. (diff) | |
download | llvm-project-559f07b872116fb85ea7d493768a6eb450329fa0.tar.gz llvm-project-559f07b872116fb85ea7d493768a6eb450329fa0.tar.bz2 llvm-project-559f07b872116fb85ea7d493768a6eb450329fa0.zip |
[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
Diffstat (limited to 'clang')
-rw-r--r-- | clang/docs/ReleaseNotes.rst | 2 | ||||
-rw-r--r-- | clang/include/clang/Basic/DiagnosticLexKinds.td | 10 | ||||
-rw-r--r-- | clang/lib/Lex/PPDirectives.cpp | 11 | ||||
-rw-r--r-- | clang/test/Preprocessor/ext-pp-directive.c | 13 |
4 files changed, 33 insertions, 3 deletions
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@-7 {{use of a '#elifndef' directive is a C++2b extension}} // pre-cpp2b-compat-warning@-8 {{use of a '#elifndef' directive is incompatible with C++ standards before C++2b}} + +#warning foo +// For C +// pre-c2x-pedantic-warning@-2 {{#warning is a C2x extension}} +// pre-c2x-pedantic-warning@-3 {{foo}} +// pre-c2x-compat-warning@-4 {{#warning is incompatible with C standards before C2x}} +// pre-c2x-compat-warning@-5 {{foo}} + +// For C++ +// pre-cpp2b-pedantic-warning@-8 {{#warning is a C++2b extension}} +// pre-cpp2b-pedantic-warning@-9 {{foo}} +// pre-cpp2b-compat-warning@-10 {{#warning is incompatible with C++ standards before C++2b}} +// pre-cpp2b-compat-warning@-11 {{foo}} |