From patchwork Fri Sep 5 17:46:33 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?TWFudWVsIEzDs3Blei1JYsOhw7Fleg==?= X-Patchwork-Id: 386481 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3669F140076 for ; Sat, 6 Sep 2014 03:47:08 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:from:date:message-id:subject:to:content-type; q= dns; s=default; b=cJMiOslZC7ZS4byEQ92cUAJWN9NZ1qwm1y9rjg2uEWR80T B7XYtQ1tN08IXjKfuM/+JKoJIf/XNUD6fucJfgdqXGqV34WGG1pcELFlRrQln755 IqV0hQNBHKYpVmpgDXytJlqes6UbmVH2DMlrcQhZxW6FotaCY2ofOwWZz6Qvg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:from:date:message-id:subject:to:content-type; s= default; bh=XVEgUrH2N2LT25FgtatjF01a5CM=; b=Q/TCuOOI5HqMlglupfSz 1Lx96+iG7dCWfMxEJExLkHAjV6lne+es/hSQD7JkupCrKZgTDcJglItr9N7VQPJc aCpUDBTMKcVYXlBPJ6Tkm4fmMlmRSvE5+sZjzNpvW9zeO7xmd4uVgKzvkzCwAiwZ VGMqefZ46amZfTtWpU+7q1c= Received: (qmail 16798 invoked by alias); 5 Sep 2014 17:47:01 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 16767 invoked by uid 89); 5 Sep 2014 17:46:59 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=AWL, BAYES_50, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wg0-f45.google.com Received: from mail-wg0-f45.google.com (HELO mail-wg0-f45.google.com) (74.125.82.45) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 05 Sep 2014 17:46:56 +0000 Received: by mail-wg0-f45.google.com with SMTP id k14so12146307wgh.16 for ; Fri, 05 Sep 2014 10:46:53 -0700 (PDT) X-Received: by 10.180.91.101 with SMTP id cd5mr5442122wib.41.1409939213509; Fri, 05 Sep 2014 10:46:53 -0700 (PDT) MIME-Version: 1.0 Received: by 10.217.80.73 with HTTP; Fri, 5 Sep 2014 10:46:33 -0700 (PDT) From: =?ISO-8859-1?Q?Manuel_L=F3pez=2DIb=E1=F1ez?= Date: Fri, 5 Sep 2014 19:46:33 +0200 Message-ID: Subject: auto generate cpp_reason to gcc OPT_W table To: Gcc Patch List , "Joseph S. Myers" X-IsSubscribed: yes This adds a new option property CppReason which maps to a warning reason code in cpplib.h. This allows us to auto-generate cpp_reason_option_codes[], which maps from CPP warning codes to GCC ones, thus making a bit harder to forget to update this table (which evidently has happened a lot in the past). Unfortunately, to use cpp warning codes we need to include cpplib.h in options.h and this would conflict with other parts of the compiler, thus I protect the table with #ifdef GCC_C_COMMON_H, and make sure in c-common.c that cpplib.h is not included before c-common.h. This patch applies on top of the previous patch about Wnormalized= but it is mostly independent of it. Bootstrapped and regression tested on x86_64-linux-gnu OK? gcc/ChangeLog: 2014-09-05 Manuel López-Ibáñez * opth-gen.awk: Generate mapping from cpp message reasons to the options that enable them. * doc/options.texi (CppReason): Document. gcc/c-family/ChangeLog: 2014-09-05 Manuel López-Ibáñez * c.opt: Add CppReason to various flags. (Wdate-time): Re-sort. * c-common.c: Include c-common.h earlier. (struct reason_option_codes_t): Delete. (c_option_controlling_cpp_error): Prefix global type and struct with cpp_. Index: gcc/doc/options.texi =================================================================== --- gcc/doc/options.texi (revision 214904) +++ gcc/doc/options.texi (working copy) @@ -486,6 +486,11 @@ to determine if a precompiled header fil @item CPP(@var{var}) The state of this option should be kept in sync with the preprocessor option @var{var}. If this property is set, then properties @code{Var} and @code{Init} must be set as well. +@item CppReason(@var{CPP_W_Enum}) +This warning option corresponds to @code{cpplib.h} warning reason code +@var{CPP_W_Enum}. This should only be used for warning options of the +C-family front-ends. + @end table Index: gcc/c-family/c.opt =================================================================== --- gcc/c-family/c.opt (revision 214904) +++ gcc/c-family/c.opt (working copy) @@ -290,23 +290,23 @@ Warn about casting functions to incompat Wbool-compare C ObjC C++ ObjC++ Var(warn_bool_compare) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) 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) Init(1) Warning +C ObjC C++ ObjC++ CPP(warn_builtin_macro_redefined) CppReason(CPP_W_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 -C ObjC CPP(cpp_warn_c90_c99_compat) Var(warn_c90_c99_compat) Init(-1) Warning +C ObjC CPP(cpp_warn_c90_c99_compat) CppReason(CPP_W_C90_C99_COMPAT) Var(warn_c90_c99_compat) Init(-1) Warning Warn about features not present in ISO C90, but present in ISO C99 Wc99-c11-compat C ObjC Var(warn_c99_c11_compat) Init(-1) Warning Warn about features not present in ISO C99, but present in ISO C11 Wc++-compat -C ObjC Var(warn_cxx_compat) CPP(warn_cxx_operator_names) Init(0) Warning +C ObjC Var(warn_cxx_compat) CPP(warn_cxx_operator_names) CppReason(CPP_W_CXX_OPERATOR_NAMES) Init(0) Warning Warn about C constructs that are not in the common subset of C and C++ Wc++0x-compat C++ ObjC++ Var(warn_cxx0x_compat) Warning LangEnabledBy(C++ ObjC++,Wall) Deprecated in favor of -Wc++11-compat @@ -326,11 +326,11 @@ Warn about subscripts whose type is \"ch Wclobbered C ObjC C++ ObjC++ Var(warn_clobbered) Warning EnabledBy(Wextra) Warn about variables that might be changed by \"longjmp\" or \"vfork\" Wcomment -C ObjC C++ ObjC++ CPP(warn_comments) Var(cpp_warn_comment) Init(0) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) +C ObjC C++ ObjC++ CPP(warn_comments) CppReason(CPP_W_COMMENTS) Var(cpp_warn_comment) Init(0) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn about possibly nested block comments, and C++ comments spanning more than one physical line Wcomments C ObjC C++ ObjC++ Warning Alias(Wcomment) Synonym for -Wcomment @@ -345,14 +345,22 @@ Warn for implicit type conversions that Wconversion-null C++ ObjC++ Var(warn_conversion_null) Init(1) Warning Warn for converting NULL from/to a non-pointer type +Wcpp +C ObjC C++ ObjC++ CppReason(CPP_W_WARNING_DIRECTIVE) +; Documented in common.opt + Wctor-dtor-privacy C++ ObjC++ Var(warn_ctor_dtor_privacy) Warning Warn when all constructors and destructors are private +Wdate-time +C ObjC C++ ObjC++ CPP(warn_date_time) CppReason(CPP_W_DATE_TIME) Var(cpp_warn_date_time) Init(0) Warning +Warn about __TIME__, __DATE__ and __TIMESTAMP__ usage + Wdeclaration-after-statement C ObjC Var(warn_declaration_after_statement) Init(-1) Warning Warn when a declaration is found after a statement Wdelete-incomplete @@ -366,11 +374,11 @@ Warn about deleting polymorphic objects Wdelete-non-virtual-dtor LangEnabledBy(C++ ObjC++,Weffc++) ; Wdeprecated -C C++ ObjC ObjC++ CPP(cpp_warn_deprecated) Var(warn_deprecated) Init(1) Warning +C C++ ObjC ObjC++ CPP(cpp_warn_deprecated) CppReason(CPP_W_DEPRECATED) Var(warn_deprecated) Init(1) Warning Warn if a deprecated compiler feature, class, method, or field is used Wdesignated-init C ObjC Var(warn_designated_init) Init(1) Warning Warn about positional initialization of structs requiring designated initializers @@ -390,11 +398,11 @@ Warn about violations of Effective C++ s Wempty-body C ObjC C++ ObjC++ Var(warn_empty_body) Warning EnabledBy(Wextra) Warn about an empty body in an if or else statement Wendif-labels -C ObjC C++ ObjC++ CPP(warn_endif_labels) Var(cpp_warn_endif_labels) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wpedantic) +C ObjC C++ ObjC++ CPP(warn_endif_labels) CppReason(CPP_W_ENDIF_LABELS) Var(cpp_warn_endif_labels) Init(1) Warning LangEnabledBy(C ObjC C++ ObjC++,Wpedantic) Warn about stray tokens after #elif and #endif Wenum-compare C ObjC C++ ObjC++ Var(warn_enum_compare) Init(-1) Warning LangEnabledBy(C ObjC,Wall) Warn about comparison of different enum types @@ -501,19 +509,19 @@ Warn when there is a cast to a pointer f Winvalid-offsetof C++ ObjC++ Var(warn_invalid_offsetof) Init(1) Warning Warn about invalid uses of the \"offsetof\" macro Winvalid-pch -C ObjC C++ ObjC++ CPP(warn_invalid_pch) Var(cpp_warn_invalid_pch) Init(0) Warning +C ObjC C++ ObjC++ CPP(warn_invalid_pch) CppReason(CPP_W_INVALID_PCH) Var(cpp_warn_invalid_pch) Init(0) Warning Warn about PCH files that are found but not used Wjump-misses-init C ObjC Var(warn_jump_misses_init) Warning LangEnabledby(C ObjC,Wc++-compat) Warn when a jump misses a variable initialization Wliteral-suffix -C++ ObjC++ CPP(warn_literal_suffix) Var(cpp_warn_literal_suffix) Init(1) Warning +C++ ObjC++ CPP(warn_literal_suffix) CppReason(CPP_W_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 C ObjC C++ ObjC++ Var(warn_logical_op) Init(0) Warning Warn when a logical operator is suspiciously always evaluating to true or false @@ -521,11 +529,11 @@ Warn when a logical operator is suspicio Wlogical-not-parentheses C ObjC C++ ObjC++ Var(warn_logical_not_paren) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn when logical not is used on the left hand side operand of a comparison Wlong-long -C ObjC C++ ObjC++ CPP(cpp_warn_long_long) Var(warn_long_long) Init(-1) Warning LangEnabledBy(C ObjC,Wc90-c99-compat) +C ObjC C++ ObjC++ CPP(cpp_warn_long_long) CppReason(CPP_W_LONG_LONG) Var(warn_long_long) Init(-1) Warning LangEnabledBy(C ObjC,Wc90-c99-compat) Do not warn about using \"long long\" when -pedantic Wmain C ObjC C++ ObjC++ Var(warn_main) Init(-1) Warning LangEnabledBy(C ObjC,Wall, 2, 0) Warn about suspicious declarations of \"main\" @@ -581,11 +589,11 @@ Warn about switches with boolean control Wmissing-format-attribute C ObjC C++ ObjC++ Alias(Wsuggest-attribute=format) ; Wmissing-include-dirs -C ObjC C++ ObjC++ CPP(warn_missing_include_dirs) Var(cpp_warn_missing_include_dirs) Init(0) Warning +C ObjC C++ ObjC++ CPP(warn_missing_include_dirs) CppReason(CPP_W_MISSING_INCLUDE_DIRS) Var(cpp_warn_missing_include_dirs) Init(0) Warning Warn about user-specified include directories that do not exist Wmissing-parameter-type C ObjC Var(warn_missing_parameter_type) Warning EnabledBy(Wextra) Warn about function parameters declared without a type specifier in K&R-style functions @@ -596,11 +604,11 @@ Warn about global functions without prot Wmudflap C ObjC C++ ObjC++ Ignore Warn(switch %qs is no longer supported) Wmultichar -C ObjC C++ ObjC++ CPP(warn_multichar) Var(cpp_warn_multichar) Init(0) Warning +C ObjC C++ ObjC++ CPP(warn_multichar) CppReason(CPP_W_MULTICHAR) Var(cpp_warn_multichar) Init(0) Warning Warn about use of multi-character character constants Wnarrowing C ObjC C++ ObjC++ Warning Var(warn_narrowing) Init(-1) LangEnabledBy(C++ ObjC++,Wall) Warn about narrowing conversions within { } that are ill-formed in C++11 @@ -631,12 +639,12 @@ Warn about NULL being passed to argument Wnonnull C ObjC C++ ObjC++ LangEnabledBy(C ObjC C++ ObjC++,Wall) ; Wnormalized C ObjC C++ ObjC++ Alias(Wnormalized=,nfc,none) ; Wnormalized= -C ObjC C++ ObjC++ RejectNegative Joined Warning CPP(warn_normalize) Init(normalized_C) Var(cpp_warn_normalize) Enum(cpp_normalize_level) +C ObjC C++ ObjC++ RejectNegative Joined Warning CPP(warn_normalize) CppReason(CPP_W_NORMALIZE) Init(normalized_C) Var(cpp_warn_normalize) Enum(cpp_normalize_level) -Wnormalized= Warn about non-normalised Unicode strings @@ -672,11 +703,11 @@ Warn about packed bit-fields whose offse Wparentheses C ObjC C++ ObjC++ Var(warn_parentheses) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn about possibly missing parentheses Wpedantic -C ObjC C++ ObjC++ CPP(cpp_pedantic) Warning +C ObjC C++ ObjC++ CPP(cpp_pedantic) CppReason(CPP_W_PEDANTIC) Warning ; Documented in common.opt Wpmf-conversions C++ ObjC++ Var(warn_pmf2ptr) Init(1) Warning Warn when converting the type of pointers to member functions @@ -699,14 +730,10 @@ Warn when a pointer is cast to an intege Wpragmas C ObjC C++ ObjC++ Var(warn_pragmas) Init(1) Warning Warn about misuses of pragmas -Wdate-time -C ObjC C++ ObjC++ CPP(warn_date_time) Var(cpp_warn_date_time) Init(0) Warning -Warn about __TIME__, __DATE__ and __TIMESTAMP__ usage - Wproperty-assign-default ObjC ObjC++ Var(warn_property_assign_default) Init(1) Warning Warn if a property for an Objective-C object has no assign semantics specified Wprotocol @@ -784,27 +811,27 @@ Deprecated. This switch has no effect Wsystem-headers C ObjC C++ ObjC++ Warning ; Documented in common.opt Wtraditional -C ObjC CPP(cpp_warn_traditional) Var(warn_traditional) Init(0) Warning +C ObjC CPP(cpp_warn_traditional) CppReason(CPP_W_TRADITIONAL) Var(warn_traditional) Init(0) Warning Warn about features not present in traditional C Wtraditional-conversion C ObjC Var(warn_traditional_conversion) Warning Warn of prototypes causing type conversions different from what would happen in the absence of prototype Wtrigraphs -C ObjC C++ ObjC++ CPP(warn_trigraphs) Var(cpp_warn_trigraphs) Init(2) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) +C ObjC C++ ObjC++ CPP(warn_trigraphs) CppReason(CPP_W_TRIGRAPHS) Var(cpp_warn_trigraphs) Init(2) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) Warn if trigraphs are encountered that might affect the meaning of the program Wundeclared-selector ObjC ObjC++ Var(warn_undeclared_selector) Warning Warn about @selector()s without previously declared methods Wundef -C ObjC C++ ObjC++ CPP(warn_undef) Var(cpp_warn_undef) Init(0) Warning +C ObjC C++ ObjC++ CPP(warn_undef) CppReason(CPP_W_UNDEF) Var(cpp_warn_undef) Init(0) Warning Warn if an undefined macro is used in an #if directive Wuninitialized C ObjC C++ ObjC++ LangEnabledBy(C ObjC C++ ObjC++,Wall) ; @@ -828,19 +855,19 @@ C ObjC C++ ObjC++ LangEnabledBy(C ObjC C Wunused-local-typedefs C ObjC C++ ObjC++ Var(warn_unused_local_typedefs) Warning EnabledBy(Wunused) Warn when typedefs locally defined in a function are not used Wunused-macros -C ObjC C++ ObjC++ Var(cpp_warn_unused_macros) Warning +C ObjC C++ ObjC++ CppReason(CPP_W_UNUSED_MACROS) Var(cpp_warn_unused_macros) Warning Warn about macros defined in the main file that are not used Wunused-result C ObjC C++ ObjC++ Var(warn_unused_result) Init(1) Warning Warn if a caller of a function, marked with attribute warn_unused_result, does not use its return value Wvariadic-macros -C ObjC C++ ObjC++ CPP(warn_variadic_macros) Var(cpp_warn_variadic_macros) Init(0) Warning LangEnabledBy(C ObjC C++ ObjC++,Wpedantic) +C ObjC C++ ObjC++ CPP(warn_variadic_macros) CppReason(CPP_W_VARIADIC_MACROS) Var(cpp_warn_variadic_macros) Init(0) Warning LangEnabledBy(C ObjC C++ ObjC++,Wpedantic) Warn about using variadic macros Wvariadic-macros LangEnabledBy(C ObjC C++ ObjC++,Wtraditional) ; Index: gcc/c-family/c-common.c =================================================================== --- gcc/c-family/c-common.c (revision 214904) +++ gcc/c-family/c-common.c (working copy) @@ -18,10 +18,11 @@ along with GCC; see the file COPYING3. . */ #include "config.h" #include "system.h" #include "coretypes.h" +#include "c-common.h" #include "tm.h" #include "intl.h" #include "tree.h" #include "fold-const.h" #include "stor-layout.h" @@ -30,11 +31,10 @@ along with GCC; see the file COPYING3. #include "attribs.h" #include "varasm.h" #include "trans-mem.h" #include "flags.h" #include "c-pragma.h" -#include "c-common.h" #include "c-objc.h" #include "tm_p.h" #include "obstack.h" #include "cpplib.h" #include "target.h" @@ -9664,51 +9664,19 @@ c_parse_error (const char *gmsgid, enum free (message); } #undef catenate_messages } -/* Mapping for cpp message reasons to the options that enable them. */ - -struct reason_option_codes_t -{ - const int reason; /* cpplib message reason. */ - const int option_code; /* gcc option that controls this message. */ -}; - -static const struct reason_option_codes_t option_codes[] = { - {CPP_W_BUILTIN_MACRO_REDEFINED, OPT_Wbuiltin_macro_redefined}, - {CPP_W_C90_C99_COMPAT, OPT_Wc90_c99_compat}, - {CPP_W_COMMENTS, OPT_Wcomment}, - {CPP_W_CXX_OPERATOR_NAMES, OPT_Wc___compat}, - {CPP_W_DATE_TIME, OPT_Wdate_time}, - {CPP_W_DEPRECATED, OPT_Wdeprecated}, - {CPP_W_ENDIF_LABELS, OPT_Wendif_labels}, - {CPP_W_INVALID_PCH, OPT_Winvalid_pch}, - {CPP_W_LITERAL_SUFFIX, OPT_Wliteral_suffix}, - {CPP_W_LONG_LONG, OPT_Wlong_long}, - {CPP_W_MISSING_INCLUDE_DIRS, OPT_Wmissing_include_dirs}, - {CPP_W_MULTICHAR, OPT_Wmultichar}, - {CPP_W_NORMALIZE, OPT_Wnormalized_}, - {CPP_W_PEDANTIC, OPT_Wpedantic}, - {CPP_W_TRADITIONAL, OPT_Wtraditional}, - {CPP_W_TRIGRAPHS, OPT_Wtrigraphs}, - {CPP_W_UNDEF, OPT_Wundef}, - {CPP_W_UNUSED_MACROS, OPT_Wunused_macros}, - {CPP_W_VARIADIC_MACROS, OPT_Wvariadic_macros}, - {CPP_W_WARNING_DIRECTIVE, OPT_Wcpp}, - {CPP_W_NONE, 0} -}; - /* Return the gcc option code associated with the reason for a cpp message, or 0 if none. */ static int c_option_controlling_cpp_error (int reason) { - const struct reason_option_codes_t *entry; + const struct cpp_reason_option_codes_t *entry; - for (entry = option_codes; entry->reason != CPP_W_NONE; entry++) + for (entry = cpp_reason_option_codes; entry->reason != CPP_W_NONE; entry++) { if (entry->reason == reason) return entry->option_code; } return 0; Index: gcc/opth-gen.awk =================================================================== --- gcc/opth-gen.awk (revision 214904) +++ gcc/opth-gen.awk (working copy) @@ -477,7 +477,34 @@ print " OPT_SPECIAL_unknown," print " OPT_SPECIAL_ignore," print " OPT_SPECIAL_program_name," print " OPT_SPECIAL_input_file" print "};" print "" +print "#ifdef GCC_C_COMMON_H" +print "/* Mapping from cpp message reasons to the options that enable them. */" +print "#include " +print "struct cpp_reason_option_codes_t" +print "{" +print " const int reason; /* cpplib message reason. */" +print " const int option_code; /* gcc option that controls this message. */" +print "};" +print "" +print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {" +for (i = 0; i < n_opts; i++) { + # With identical flags, pick only the last one. The + # earlier loop ensured that it has all flags merged, + # and a nonempty help text if one of the texts was nonempty. + while( i + 1 != n_opts && opts[i] == opts[i + 1] ) { + i++; + } + cpp_reason = nth_arg(0, opt_args("CppReason", flags[i])); + if (cpp_reason != "") { + cpp_reason = cpp_reason ","; + printf(" {%-40s %s},\n", cpp_reason, opt_enum(opts[i])) + } +} +printf(" {%-40s 0},\n", "CPP_W_NONE,") +print "};" +print "#endif" +print "" print "#endif /* OPTIONS_H */" }