PR driver/69265: add hint for options with misspelled arguments
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 19 May 2016 00:52:08 +0000 (00:52 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Thu, 19 May 2016 00:52:08 +0000 (00:52 +0000)
opts-common.c's cmdline_handle_error handles invalid arguments
for options with CL_ERR_ENUM_ARG by building a string listing the
valid arguments.  By also building a vec of valid arguments, we
can use find_closest_string and provide a hint if we see a close
misspelling.

gcc/ChangeLog:
PR driver/69265
* Makefile.in (GCC_OBJS): Move spellcheck.o to...
(OBJS-libcommon-target): ...here.
* opts-common.c: Include spellcheck.h.
(cmdline_handle_error): Build a vec of valid options and use it
to suggest provide hints for misspelled arguments.

gcc/testsuite/ChangeLog:
PR driver/69265
* gcc.dg/spellcheck-options-11.c: New test case.

From-SVN: r236439

gcc/ChangeLog
gcc/Makefile.in
gcc/opts-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/spellcheck-options-11.c [new file with mode: 0644]

index 3b94d646829e60e73a1ea58d8b84261c8bab61ca..cde433e3d0546fd088f349a4e602bccf198f2465 100644 (file)
@@ -1,3 +1,12 @@
+2016-05-18  David Malcolm  <dmalcolm@redhat.com>
+
+       PR driver/69265
+       * Makefile.in (GCC_OBJS): Move spellcheck.o to...
+       (OBJS-libcommon-target): ...here.
+       * opts-common.c: Include spellcheck.h.
+       (cmdline_handle_error): Build a vec of valid options and use it
+       to suggest provide hints for misspelled arguments.
+
 2016-05-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/71100
index 673f87dad890fb596c597caf42d843a7ffe0302a..587417b4c21aedbf1827361f63bea2f4d7cc61f8 100644 (file)
@@ -1160,7 +1160,7 @@ CXX_TARGET_OBJS=@cxx_target_objs@
 FORTRAN_TARGET_OBJS=@fortran_target_objs@
 
 # Object files for gcc many-languages driver.
-GCC_OBJS = gcc.o gcc-main.o ggc-none.o spellcheck.o
+GCC_OBJS = gcc.o gcc-main.o ggc-none.o
 
 c-family-warn = $(STRICT_WARN)
 
@@ -1549,7 +1549,7 @@ OBJS-libcommon = diagnostic.o diagnostic-color.o diagnostic-show-locus.o \
 # compiler and containing target-dependent code.
 OBJS-libcommon-target = $(common_out_object_file) prefix.o params.o \
        opts.o opts-common.o options.o vec.o hooks.o common/common-targhooks.o \
-       hash-table.o file-find.o
+       hash-table.o file-find.o spellcheck.o
 
 # This lists all host objects for the front ends.
 ALL_HOST_FRONTEND_OBJS = $(foreach v,$(CONFIG_LANGUAGES),$($(v)_OBJS))
index bb689827227bffc1c675e21ac784096ba7d1af4d..4e1ef497ed8015155b0cc48f35d6aff523e761e2 100644 (file)
@@ -24,6 +24,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "opts.h"
 #include "options.h"
 #include "diagnostic.h"
+#include "spellcheck.h"
 
 static void prune_options (struct cl_decoded_option **, unsigned int *);
 
@@ -1113,6 +1114,7 @@ cmdline_handle_error (location_t loc, const struct cl_option *option,
       for (i = 0; e->values[i].arg != NULL; i++)
        len += strlen (e->values[i].arg) + 1;
 
+      auto_vec <const char *> candidates;
       s = XALLOCAVEC (char, len);
       p = s;
       for (i = 0; e->values[i].arg != NULL; i++)
@@ -1123,9 +1125,16 @@ cmdline_handle_error (location_t loc, const struct cl_option *option,
          memcpy (p, e->values[i].arg, arglen);
          p[arglen] = ' ';
          p += arglen + 1;
+         candidates.safe_push (e->values[i].arg);
        }
       p[-1] = 0;
-      inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
+      const char *hint = find_closest_string (arg, &candidates);
+      if (hint)
+       inform (loc, "valid arguments to %qs are: %s; did you mean %qs?",
+               option->opt_text, s, hint);
+      else
+       inform (loc, "valid arguments to %qs are: %s", option->opt_text, s);
+
       return true;
     }
 
index 6a684fc52d4ae8c01582d54d1d603f847f8537c3..642fee3ff0546cb778d6638d2fbb61e08933a92a 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-18  David Malcolm  <dmalcolm@redhat.com>
+
+       PR driver/69265
+       * gcc.dg/spellcheck-options-11.c: New test case.
+
 2016-05-18  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/71100
diff --git a/gcc/testsuite/gcc.dg/spellcheck-options-11.c b/gcc/testsuite/gcc.dg/spellcheck-options-11.c
new file mode 100644 (file)
index 0000000..8e27141
--- /dev/null
@@ -0,0 +1,7 @@
+/* Verify that we provide a hint if the user misspells an option argument
+   (PR driver/69265).  */
+
+/* { dg-do compile } */
+/* { dg-options "-ftls-model=global-dinamic" } */
+/* { dg-error "unknown TLS model 'global-dinamic'"  "" { target *-*-* } 0 } */
+/* { dg-message "valid arguments to '-ftls-model=' are: global-dynamic initial-exec local-dynamic local-exec; did you mean 'global-dynamic'?"  "" { target *-*-* } 0 } */