diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2015-09-23 13:07:07 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2015-09-23 13:07:07 +0000 |
commit | c1822f9c9b169c9588a110522dd60d579edaf6d1 (patch) | |
tree | 36263b59f5fe1b8892bd6bafafc963cd33e5923f /gcc/c-family | |
parent | 9ea4e88f177aec6d897055efc954b4de05766017 (diff) | |
download | gcc-c1822f9c9b169c9588a110522dd60d579edaf6d1.zip gcc-c1822f9c9b169c9588a110522dd60d579edaf6d1.tar.gz gcc-c1822f9c9b169c9588a110522dd60d579edaf6d1.tar.bz2 |
[c-family/49654/49655] reject invalid options in pragma diagnostic
Use find_opt instead of linear search through options in
handle_pragma_diagnostic (PR 49654) and reject non-warning options and
options not valid for the current language (PR 49655).
gcc/testsuite/ChangeLog:
2015-09-23 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c/49655
* gcc.dg/pragma-diag-6.c: New test.
gcc/ChangeLog:
2015-09-23 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c/49655
* opts.h (write_langs): Declare.
* opts-global.c (write_langs): Make it extern.
gcc/c-family/ChangeLog:
2015-09-23 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR c/49654
PR c/49655
* c-pragma.c (handle_pragma_diagnostic): Detect non-warning
options and options not valid for the current language.
From-SVN: r228049
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-family/c-pragma.c | 46 |
2 files changed, 39 insertions, 14 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index e887735..8d4df76 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2015-09-23 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR c/49654 + PR c/49655 + * c-pragma.c (handle_pragma_diagnostic): Detect non-warning + options and options not valid for the current language. + 2015-09-22 Patrick Palka <ppalka@gcc.gnu.org> * c-indentation.c (should_warn_for_misleading_indentation): diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index de2304e..3c34800 100644 --- a/gcc/c-family/c-pragma.c +++ b/gcc/c-family/c-pragma.c @@ -749,22 +749,40 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy)) return; } + const char *option_string = TREE_STRING_POINTER (x); + unsigned int lang_mask = c_common_option_lang_mask () | CL_COMMON; + /* option_string + 1 to skip the initial '-' */ + unsigned int option_index = find_opt (option_string + 1, lang_mask); + if (option_index == OPT_SPECIAL_unknown) + { + warning_at (loc, OPT_Wpragmas, + "unknown option after %<#pragma GCC diagnostic%> kind"); + return; + } + else if (!(cl_options[option_index].flags & CL_WARNING)) + { + warning_at (loc, OPT_Wpragmas, + "%qs is not an option that controls warnings", option_string); + return; + } + else if (!(cl_options[option_index].flags & lang_mask)) + { + char *ok_langs = write_langs (cl_options[option_index].flags); + char *bad_lang = write_langs (c_common_option_lang_mask ()); + warning_at (loc, OPT_Wpragmas, + "option %qs is valid for %s but not for %s", + option_string, ok_langs, bad_lang); + free (ok_langs); + free (bad_lang); + return; + } + struct cl_option_handlers handlers; set_default_handlers (&handlers); - - unsigned int option_index; - const char *option_string = TREE_STRING_POINTER (x); - for (option_index = 0; option_index < cl_options_count; option_index++) - if (strcmp (cl_options[option_index].opt_text, option_string) == 0) - { - control_warning_option (option_index, (int) kind, kind != DK_IGNORED, - input_location, c_family_lang_mask, &handlers, - &global_options, &global_options_set, - global_dc); - return; - } - warning_at (loc, OPT_Wpragmas, - "unknown option after %<#pragma GCC diagnostic%> kind"); + control_warning_option (option_index, (int) kind, kind != DK_IGNORED, + loc, lang_mask, &handlers, + &global_options, &global_options_set, + global_dc); } /* Parse #pragma GCC target (xxx) to set target specific options. */ |