diff options
author | David Malcolm <dmalcolm@redhat.com> | 2016-05-19 00:52:08 +0000 |
---|---|---|
committer | David Malcolm <dmalcolm@gcc.gnu.org> | 2016-05-19 00:52:08 +0000 |
commit | 70f25790a1effc8f1cba3cb8a368b129c66a87b0 (patch) | |
tree | 9a1079536c4e30ba3cb0ff1e7cf8ebb14bdadd92 /gcc | |
parent | 69e95fa03cda406fe61e94371244f0ba9b59339e (diff) | |
download | gcc-70f25790a1effc8f1cba3cb8a368b129c66a87b0.zip gcc-70f25790a1effc8f1cba3cb8a368b129c66a87b0.tar.gz gcc-70f25790a1effc8f1cba3cb8a368b129c66a87b0.tar.bz2 |
PR driver/69265: add hint for options with misspelled arguments
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/Makefile.in | 4 | ||||
-rw-r--r-- | gcc/opts-common.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/spellcheck-options-11.c | 7 |
5 files changed, 33 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3b94d64..cde433e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 673f87d..587417b 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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)) diff --git a/gcc/opts-common.c b/gcc/opts-common.c index bb68982..4e1ef49 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6a684fc..642fee3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..8e27141 --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-options-11.c @@ -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 } */ |