This patch is on top of https://gcc.gnu.org/ml/gcc-patches/2014-08/msg02244.html
The main issue here is Wendif-labels, since we were not using the correct CPP_W_* flag. The rest are straight-forward. libcpp/ChangeLog: 2014-08-25 Manuel López-Ibáñez <m...@gcc.gnu.org> * directives.c (check_eol_1): New. (check_eol_endif_labels): New. (check_eol): Call check_eol_1. (do_else,do_endif): Call check_eol_endif_labels. gcc/c-family/ChangeLog: 2014-08-25 Manuel López-Ibáñez <m...@gcc.gnu.org> * c.opt (Wbuiltin-macro-redefined,Wdeprecated,Wendif-labels, Winvalid-pch,Wliteral-suffix,Wmissing-include-dirs,Wtrigraphs, Wundef): Use CPP, Var and Init. * c-opts.c (c_common_handle_option): Do not handle the above flags here.
diff -u gcc/c-family/c.opt gcc/c-family/c.opt --- gcc/c-family/c.opt (working copy) +++ gcc/c-family/c.opt (working copy) @@ -292,7 +292,7 @@ Warn about boolean expression compared with an integer value different from true/false Wbuiltin-macro-redefined -C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) Var(cpp_warn_builtin_macro_redefined) Warning +C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) Var(cpp_warn_builtin_macro_redefined) Init(1) Warning Warn when a built-in preprocessor macro is undefined or redefined Wc90-c99-compat @@ -368,7 +368,7 @@ ; Wdeprecated -C C++ ObjC ObjC++ Var(warn_deprecated) Init(1) Warning +C C++ ObjC ObjC++ CPP(cpp_warn_deprecated) Var(warn_deprecated) Init(1) Warning Warn if a deprecated compiler feature, class, method, or field is used Wdesignated-init @@ -392,7 +392,7 @@ Warn about an empty body in an if or else statement Wendif-labels -C ObjC C++ ObjC++ Warning +C ObjC C++ ObjC++ CPP(warn_endif_labels) Var(cpp_warn_endif_labels) Init(1) Warning Warn about stray tokens after #elif and #endif Wenum-compare @@ -503,7 +503,7 @@ Warn about invalid uses of the \"offsetof\" macro Winvalid-pch -C ObjC C++ ObjC++ Warning +C ObjC C++ ObjC++ CPP(warn_invalid_pch) Var(cpp_warn_invalid_pch) Warning Warn about PCH files that are found but not used Wjump-misses-init @@ -511,7 +511,7 @@ Warn when a jump misses a variable initialization Wliteral-suffix -C++ ObjC++ Warning +C++ ObjC++ CPP(warn_literal_suffix) Var(cpp_warn_literal_suffix) Init(1) Warning Warn when a string or character literal is followed by a ud-suffix which does not begin with an underscore. Wlogical-op @@ -583,7 +583,7 @@ ; Wmissing-include-dirs -C ObjC C++ ObjC++ Warning +C ObjC C++ ObjC++ CPP(warn_missing_include_dirs) Var(cpp_warn_missing_include_dirs) Warning Warn about user-specified include directories that do not exist Wmissing-parameter-type @@ -794,7 +794,7 @@ Warn of prototypes causing type conversions different from what would happen in the absence of prototype Wtrigraphs -C ObjC C++ ObjC++ Warning +C ObjC C++ ObjC++ CPP(warn_trigraphs) Var(cpp_warn_trigraphs) Init(2) Warning Warn if trigraphs are encountered that might affect the meaning of the program Wundeclared-selector @@ -802,7 +802,7 @@ Warn about @selector()s without previously declared methods Wundef -C ObjC C++ ObjC++ Warning +C ObjC C++ ObjC++ CPP(warn_undef) Var(cpp_warn_undef) Warning Warn if an undefined macro is used in an #if directive Wuninitialized diff -u gcc/c-family/c-opts.c gcc/c-family/c-opts.c --- gcc/c-family/c-opts.c (working copy) +++ gcc/c-family/c-opts.c (working copy) @@ -389,29 +389,10 @@ cpp_opts->warn_cxx_operator_names = value; break; - case OPT_Wdeprecated: - cpp_opts->cpp_warn_deprecated = value; - break; - - case OPT_Wendif_labels: - cpp_opts->warn_endif_labels = value; - break; - - case OPT_Winvalid_pch: - cpp_opts->warn_invalid_pch = value; - break; - - case OPT_Wliteral_suffix: - cpp_opts->warn_literal_suffix = value; - break; - case OPT_Wlong_long: cpp_opts->cpp_warn_long_long = value; break; - case OPT_Wmissing_include_dirs: - cpp_opts->warn_missing_include_dirs = value; - break; case OPT_Wnormalized_: /* FIXME: Move all this to c.opt. */ if (kind == DK_ERROR) @@ -439,14 +420,6 @@ cpp_opts->cpp_warn_traditional = value; break; - case OPT_Wtrigraphs: - cpp_opts->warn_trigraphs = value; - break; - - case OPT_Wundef: - cpp_opts->warn_undef = value; - break; - case OPT_Wunknown_pragmas: /* Set to greater than 1, so that even unknown pragmas in system headers will be warned about. */ diff -u libcpp/directives.c libcpp/directives.c --- libcpp/directives.c (working copy) +++ libcpp/directives.c (working copy) @@ -213,16 +213,33 @@ ; } -/* Ensure there are no stray tokens at the end of a directive. If - EXPAND is true, tokens macro-expanding to nothing are allowed. */ +/* Helper function for check_oel. */ + static void -check_eol (cpp_reader *pfile, bool expand) +check_eol_1 (cpp_reader *pfile, bool expand, int reason) { if (! SEEN_EOL () && (expand ? cpp_get_token (pfile) : _cpp_lex_token (pfile))->type != CPP_EOF) - cpp_error (pfile, CPP_DL_PEDWARN, "extra tokens at end of #%s directive", - pfile->directive->name); + cpp_pedwarning (pfile, reason, "extra tokens at end of #%s directive", + pfile->directive->name); +} + +/* Variant of check_eol used for Wendif-labels warnings. */ + +static void +check_eol_endif_labels (cpp_reader *pfile) +{ + check_eol_1 (pfile, false, CPP_W_ENDIF_LABELS); +} + +/* Ensure there are no stray tokens at the end of a directive. If + EXPAND is true, tokens macro-expanding to nothing are allowed. */ + +static void +check_eol (cpp_reader *pfile, bool expand) +{ + check_eol_1 (pfile, expand, CPP_W_NONE); } /* Ensure there are no stray tokens other than comments at the end of @@ -1990,7 +2007,7 @@ /* Only check EOL if was not originally skipping. */ if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) - check_eol (pfile, false); + check_eol_endif_labels (pfile); } } @@ -2051,7 +2068,7 @@ { /* Only check EOL if was not originally skipping. */ if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels)) - check_eol (pfile, false); + check_eol_endif_labels (pfile); /* If potential control macro, we go back outside again. */ if (ifs->next == 0 && ifs->mi_cmacro)