From 603107fbb0da3acb1ce296dfef1a592a6451c0b4 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Thu, 30 Jun 2016 14:28:50 +0000 Subject: [PATCH] Fix bogus option suggestions for RejectNegative options (PR driver/71651) gcc/ChangeLog: PR driver/71651 * gcc.c (driver::build_option_suggestions): Pass "option" to add_misspelling_candidates. * opts-common.c (add_misspelling_candidates): Add "option" param; use it to avoid adding negated forms for options marked with RejectNegative. * opts.h (add_misspelling_candidates): Add "option" param. gcc/testsuite/ChangeLog: PR driver/71651 * gcc.dg/spellcheck-options-12.c: New test case. From-SVN: r237880 --- gcc/ChangeLog | 10 ++++++++++ gcc/gcc.c | 9 ++++++--- gcc/opts-common.c | 10 ++++++++-- gcc/opts.h | 1 + gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/spellcheck-options-12.c | 7 +++++++ 6 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/spellcheck-options-12.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d00f72c34d..28b93870731 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-06-30 David Malcolm + + PR driver/71651 + * gcc.c (driver::build_option_suggestions): Pass "option" to + add_misspelling_candidates. + * opts-common.c (add_misspelling_candidates): Add "option" param; + use it to avoid adding negated forms for options marked with + RejectNegative. + * opts.h (add_misspelling_candidates): Add "option" param. + 2016-06-30 Jakub Jelinek PR middle-end/71693 diff --git a/gcc/gcc.c b/gcc/gcc.c index ab113102bc6..634f8e6002a 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -7700,12 +7700,14 @@ driver::build_option_suggestions (void) for (unsigned j = 0; e->values[j].arg != NULL; j++) { char *with_arg = concat (opt_text, e->values[j].arg, NULL); - add_misspelling_candidates (m_option_suggestions, with_arg); + add_misspelling_candidates (m_option_suggestions, option, + with_arg); free (with_arg); } } else - add_misspelling_candidates (m_option_suggestions, opt_text); + add_misspelling_candidates (m_option_suggestions, option, + opt_text); break; case OPT_fsanitize_: @@ -7729,7 +7731,8 @@ driver::build_option_suggestions (void) /* Add with_arg and all of its variant spellings e.g. "-fno-sanitize=address" to candidates (albeit without leading dashes). */ - add_misspelling_candidates (m_option_suggestions, with_arg); + add_misspelling_candidates (m_option_suggestions, option, + with_arg); free (with_arg); } } diff --git a/gcc/opts-common.c b/gcc/opts-common.c index 4e1ef497ed8..8634b520ecf 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -374,8 +374,9 @@ static const struct option_map option_map[] = to specific options. We want to do the reverse: to find all the ways that a user could validly spell an option. - Given valid OPT_TEXT (with a leading dash), add it and all of its valid - variant spellings to CANDIDATES, each without a leading dash. + Given valid OPT_TEXT (with a leading dash) for OPTION, add it and all + of its valid variant spellings to CANDIDATES, each without a leading + dash. For example, given "-Wabi-tag", the following are added to CANDIDATES: "Wabi-tag" @@ -387,9 +388,11 @@ static const struct option_map option_map[] = void add_misspelling_candidates (auto_vec *candidates, + const struct cl_option *option, const char *opt_text) { gcc_assert (candidates); + gcc_assert (option); gcc_assert (opt_text); candidates->safe_push (xstrdup (opt_text + 1)); for (unsigned i = 0; i < ARRAY_SIZE (option_map); i++) @@ -398,6 +401,9 @@ add_misspelling_candidates (auto_vec *candidates, const char *new_prefix = option_map[i].new_prefix; size_t new_prefix_len = strlen (new_prefix); + if (option->cl_reject_negative && option_map[i].negated) + continue; + if (strncmp (opt_text, new_prefix, new_prefix_len) == 0) { char *alternative = concat (opt0 + 1, opt_text + new_prefix_len, diff --git a/gcc/opts.h b/gcc/opts.h index 1b5cf448a29..25d32c1ad49 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -417,6 +417,7 @@ extern const struct sanitizer_opts_s } sanitizer_opts[]; extern void add_misspelling_candidates (auto_vec *candidates, + const struct cl_option *option, const char *base_option); #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1828ca63fe4..8527a2fed01 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-06-30 David Malcolm + + PR driver/71651 + * gcc.dg/spellcheck-options-12.c: New test case. + 2016-06-30 Jakub Jelinek PR middle-end/71693 diff --git a/gcc/testsuite/gcc.dg/spellcheck-options-12.c b/gcc/testsuite/gcc.dg/spellcheck-options-12.c new file mode 100644 index 00000000000..b5e65e54a39 --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-options-12.c @@ -0,0 +1,7 @@ +/* Verify that we don't include -Wno- variants for options marked + with RejectNegative when considering hints for misspelled options + (PR driver/71651). */ + +/* { dg-do compile } */ +/* { dg-options "-fno-stack-protector-explicit" } */ +/* { dg-error "unrecognized command line option .-fno-stack-protector-explicit.; did you mean .-fstack-protector-explicit.." "" { target *-*-* } 0 } */ -- 2.11.4.GIT