Provide hint for misspelled -fdump-foo options.
authorMartin Liska <mliska@suse.cz>
Thu, 19 Mar 2020 10:58:53 +0000 (11:58 +0100)
committerMartin Liska <mliska@suse.cz>
Tue, 5 May 2020 14:02:06 +0000 (16:02 +0200)
gcc/ChangeLog:

2020-03-19  Martin Liska  <mliska@suse.cz>

* dumpfile.c (dump_switch_p): Change return type
and print option suggestion.
* dumpfile.h: Change return type.
* opts-global.c (handle_common_deferred_options):
Move error into dump_switch_p function.

gcc/testsuite/ChangeLog:

2020-03-19  Martin Liska  <mliska@suse.cz>

* gcc.dg/spellcheck-options-22.c: New test.

gcc/dumpfile.c
gcc/dumpfile.h
gcc/opts-global.c
gcc/testsuite/gcc.dg/spellcheck-options-22.c [new file with mode: 0644]

index e392ecf307c4ad9814016ea90dfc7bad40ac5d2c..54718784fd4ed9e91f76d1b4a7fdef457a07d8d4 100644 (file)
@@ -39,6 +39,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-pass.h" /* for "current_pass".  */
 #include "optinfo-emit-json.h"
 #include "stringpool.h" /* for get_identifier.  */
+#include "spellcheck.h"
 
 /* If non-NULL, return one past-the-end of the matching SUBPART of
    the WHOLE string.  */
@@ -1874,7 +1875,7 @@ dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob)
   return 1;
 }
 
-int
+void
 gcc::dump_manager::
 dump_switch_p (const char *arg)
 {
@@ -1896,8 +1897,20 @@ dump_switch_p (const char *arg)
     for (i = 0; i < m_extra_dump_files_in_use; i++)
       any |= dump_switch_p_1 (arg, &m_extra_dump_files[i], true);
 
-
-  return any;
+  if (!any)
+    {
+      auto_vec<const char *> candidates;
+      for (size_t i = TDI_none + 1; i != TDI_end; i++)
+       candidates.safe_push (dump_files[i].swtch);
+      for (size_t i = 0; i < m_extra_dump_files_in_use; i++)
+       candidates.safe_push (m_extra_dump_files[i].swtch);
+      const char *hint = find_closest_string (arg, &candidates);
+      if (hint)
+       error ("unrecognized command-line option %<-fdump-%s%>; "
+              "did you mean %<-fdump-%s%>?", arg, hint);
+      else
+       error ("unrecognized command-line option %<-fdump-%s%>", arg);
+    }
 }
 
 /* Parse ARG as a -fopt-info switch and store flags, optgroup_flags
index 840ae4d55d55694e21ee9bf3a2818af4e15b8e25..00e175a4737992c2fa8a27b287a819b8b7def5ba 100644 (file)
@@ -691,7 +691,7 @@ public:
   char *
   get_dump_file_name (struct dump_file_info *dfi, int part = -1) const;
 
-  int
+  void
   dump_switch_p (const char *arg);
 
   /* Start a dump for PHASE. Store user-supplied dump flags in
index c658805470e473742a1cf0434ec11daa6e7583b5..b1a8429dc3c79ef747745eeedc26193bb6f0bf8d 100644 (file)
@@ -385,8 +385,7 @@ handle_common_deferred_options (void)
          break;
 
        case OPT_fdump_:
-         if (!g->get_dumps ()->dump_switch_p (opt->arg))
-           error ("unrecognized command-line option %<-fdump-%s%>", opt->arg);
+         g->get_dumps ()->dump_switch_p (opt->arg);
          break;
 
         case OPT_fopt_info_:
diff --git a/gcc/testsuite/gcc.dg/spellcheck-options-22.c b/gcc/testsuite/gcc.dg/spellcheck-options-22.c
new file mode 100644 (file)
index 0000000..b0ddae2
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-ipa-ynline" } */
+/* { dg-error "unrecognized command-line option '-fdump-ipa-ynline'; did you mean '-fdump-ipa-inline'?" "" { target *-*-* } 0 } */