[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
This commit is contained in:
parent
aee76cb59c
commit
559f07b872
|
@ -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.
|
||||
|
|
|
@ -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>;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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}}
|
||||
|
|
Loading…
Reference in New Issue