This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix bogus option suggestions for RejectNegative options (PR driver/71651)


PR driver/71651 identifies an issue where the driver can make
nonsensical suggestions for options flagged as RejectNegative:

 $ gcc -fno-stack-protector-explicit
 gcc: error: unrecognized command line option '-fno-stack-protector-explicit';
 did you mean '-fno-stack-protector-explicit'?

where the driver erroneously suggests the same bogus option that was
provided.

Fixed thusly.

Successfully bootstrapped&regretested on x86_64-pc-linux-gnu.

OK for trunk and gcc-6-branch?

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.
---
 gcc/gcc.c                                    |  9 ++++++---
 gcc/opts-common.c                            | 10 ++++++++--
 gcc/opts.h                                   |  1 +
 gcc/testsuite/gcc.dg/spellcheck-options-12.c |  7 +++++++
 4 files changed, 22 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/spellcheck-options-12.c

diff --git a/gcc/gcc.c b/gcc/gcc.c
index ab11310..634f8e6 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 4e1ef49..8634b52 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<char *> *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<char *> *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 1b5cf44..25d32c1 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<char *> *candidates,
+					const struct cl_option *option,
 					const char *base_option);
 
 #endif
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 0000000..b5e65e5
--- /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 } */
-- 
1.8.5.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]