Offer suggestions for misspelled --param names.
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 30 Jun 2016 00:05:39 +0000 (00:05 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Thu, 30 Jun 2016 00:05:39 +0000 (00:05 +0000)
gcc/ChangeLog:
* opts.c (handle_param): Use find_param_fuzzy to offer suggestions
for misspelled param names.
* params.c: Include spellcheck.h.
(find_param_fuzzy): New function.
* params.h (find_param_fuzzy): New prototype.
* spellcheck.c (struct edit_distance_traits<const char *>): Move
to...
* spellcheck.h (struct edit_distance_traits<const char *>):
...here.

gcc/testsuite/ChangeLog:
* gcc.dg/spellcheck-params.c: New testcase.
* gcc.dg/spellcheck-params-2.c: New testcase.

From-SVN: r237865

gcc/ChangeLog
gcc/opts.c
gcc/params.c
gcc/params.h
gcc/spellcheck.c
gcc/spellcheck.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/spellcheck-params-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/spellcheck-params.c [new file with mode: 0644]

index 8df7f3c4b82c148ea41a4d11c8c82c1efe0cc7d3..308fcc8604987c6529158e141092307445609c0b 100644 (file)
@@ -1,3 +1,15 @@
+2016-06-29  David Malcolm  <dmalcolm@redhat.com>
+
+       * opts.c (handle_param): Use find_param_fuzzy to offer suggestions
+       for misspelled param names.
+       * params.c: Include spellcheck.h.
+       (find_param_fuzzy): New function.
+       * params.h (find_param_fuzzy): New prototype.
+       * spellcheck.c (struct edit_distance_traits<const char *>): Move
+       to...
+       * spellcheck.h (struct edit_distance_traits<const char *>):
+       ...here.
+
 2016-06-29  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * config/rs6000/predicates.md (const_0_to_7_operand): New
index 74062106895d2b994c83cecaf419e0cbbaa70517..f09c520975ba110e60262f48f21545124bed7316 100644 (file)
@@ -2228,7 +2228,14 @@ handle_param (struct gcc_options *opts, struct gcc_options *opts_set,
 
       enum compiler_param index;
       if (!find_param (arg, &index))
-       error_at (loc, "invalid --param name %qs", arg);
+       {
+         const char *suggestion = find_param_fuzzy (arg);
+         if (suggestion)
+           error_at (loc, "invalid --param name %qs; did you mean %qs?",
+                     arg, suggestion);
+         else
+           error_at (loc, "invalid --param name %qs", arg);
+       }
       else
        {
          if (!param_string_value_p (index, equal + 1, &value))
index 41660b47393a37bb8e9f2fecc476b51a75d3fa69..1b5000bb8d783247626593208adc12dcc7beaf40 100644 (file)
@@ -25,6 +25,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "params.h"
 #include "params-enum.h"
 #include "diagnostic-core.h"
+#include "spellcheck.h"
 
 /* An array containing the compiler parameters and their current
    values.  */
@@ -142,6 +143,19 @@ find_param (const char *name, enum compiler_param *index)
   return false;
 }
 
+/* Look for the closest match for NAME in the parameter table, returning it
+   if it is a reasonable suggestion for a misspelling.  Return NULL
+   otherwise.  */
+
+const char *
+find_param_fuzzy (const char *name)
+{
+  best_match <const char *, const char *> bm (name);
+  for (size_t i = 0; i < num_compiler_params; ++i)
+    bm.consider (compiler_params[i].option);
+  return bm.get_best_meaningful_candidate ();
+}
+
 /* Return true if param with entry index INDEX should be defined using strings.
    If so, return the value corresponding to VALUE_NAME in *VALUE_P.  */
 
index 7221ab65a61af90d90c268920a3bf8c1bf5eaed5..97c8d56505506cd0cb7ad4aa8163cdb101d35cd9 100644 (file)
@@ -89,6 +89,7 @@ enum compiler_param
 };
 
 extern bool find_param (const char *, enum compiler_param *);
+extern const char *find_param_fuzzy (const char *name);
 extern bool param_string_value_p (enum compiler_param, const char *, int *);
 
 /* The value of the parameter given by ENUM.  Not an lvalue.  */
index 2648f3a0bbb9adc52523e9f071e794e72d134b09..b37b1e469299210aae99a508a57e502dd5157f87 100644 (file)
@@ -121,24 +121,6 @@ levenshtein_distance (const char *s, const char *t)
   return levenshtein_distance (s, strlen (s), t, strlen (t));
 }
 
-/* Specialization of edit_distance_traits for C-style strings.  */
-
-template <>
-struct edit_distance_traits<const char *>
-{
-  static size_t get_length (const char *str)
-  {
-    gcc_assert (str);
-    return strlen (str);
-  }
-
-  static const char *get_string (const char *str)
-  {
-    gcc_assert (str);
-    return str;
-  }
-};
-
 /* Given TARGET, a non-NULL string, and CANDIDATES, a non-NULL ptr to
    an autovec of non-NULL strings, determine which element within
    CANDIDATES has the lowest edit distance to TARGET.  If there are
index 035f4ac360880bdbb8970bcf746d37692eaab73f..b48cfbc4072e607492bf0bb3db38cd953955b431 100644 (file)
@@ -48,6 +48,24 @@ find_closest_string (const char *target,
 template <typename TYPE>
 struct edit_distance_traits {};
 
+/* Specialization of edit_distance_traits for C-style strings.  */
+
+template <>
+struct edit_distance_traits<const char *>
+{
+  static size_t get_length (const char *str)
+  {
+    gcc_assert (str);
+    return strlen (str);
+  }
+
+  static const char *get_string (const char *str)
+  {
+    gcc_assert (str);
+    return str;
+  }
+};
+
 /* A type for use when determining the best match against a string,
    expressed as a template so that we can match against various
    string-like types (const char *, frontend identifiers, and preprocessor
index 9763bacb9d30e71cedb44a8d1ac78aa36d7cc143..8069c679666810fae2ee9fe6f0461a362c4a2902 100644 (file)
@@ -1,3 +1,8 @@
+2016-06-29  David Malcolm  <dmalcolm@redhat.com>
+
+       * gcc.dg/spellcheck-params.c: New testcase.
+       * gcc.dg/spellcheck-params-2.c: New testcase.
+
 2016-06-29  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/p9-extract-1.c: New file to test ISA 3.0
diff --git a/gcc/testsuite/gcc.dg/spellcheck-params-2.c b/gcc/testsuite/gcc.dg/spellcheck-params-2.c
new file mode 100644 (file)
index 0000000..27e293f
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "--param does-not-resemble-anything=42" } */
+/* { dg-error "invalid --param name .does-not-resemble-anything."  "" { target *-*-* } 0 } */
+
diff --git a/gcc/testsuite/gcc.dg/spellcheck-params.c b/gcc/testsuite/gcc.dg/spellcheck-params.c
new file mode 100644 (file)
index 0000000..1bb7bca
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "--param max-early-inliner-iteration=3" } */
+/* { dg-error "invalid --param name .max-early-inliner-iteration.; did you mean .max-early-inliner-iterations.?"  "" { target *-*-* } 0 } */
+