cor3ntin created this revision.
Herald added a project: All.
cor3ntin requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
The #warning directive is standard in C++2b and C2x,
this adjusts the pedantic and extensions warning accordingly.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D130415
Files:
clang/include/clang/Basic/DiagnosticLexKinds.td
clang/lib/Lex/PPDirectives.cpp
clang/test/Preprocessor/ext-pp-directive.c
Index: clang/test/Preprocessor/ext-pp-directive.c
===================================================================
--- clang/test/Preprocessor/ext-pp-directive.c
+++ clang/test/Preprocessor/ext-pp-directive.c
@@ -57,3 +57,16 @@
// 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}}
Index: clang/lib/Lex/PPDirectives.cpp
===================================================================
--- clang/lib/Lex/PPDirectives.cpp
+++ clang/lib/Lex/PPDirectives.cpp
@@ -1261,7 +1261,13 @@
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);
Index: clang/include/clang/Basic/DiagnosticLexKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticLexKinds.td
+++ clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -387,7 +387,15 @@
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>;
Index: clang/test/Preprocessor/ext-pp-directive.c
===================================================================
--- clang/test/Preprocessor/ext-pp-directive.c
+++ clang/test/Preprocessor/ext-pp-directive.c
@@ -57,3 +57,16 @@
// 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}}
Index: clang/lib/Lex/PPDirectives.cpp
===================================================================
--- clang/lib/Lex/PPDirectives.cpp
+++ clang/lib/Lex/PPDirectives.cpp
@@ -1261,7 +1261,13 @@
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);
Index: clang/include/clang/Basic/DiagnosticLexKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticLexKinds.td
+++ clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -387,7 +387,15 @@
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>;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits