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
This commit is contained in:
parent
69e95fa03c
commit
70f25790a1
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 } */
|
Loading…
Reference in New Issue