From 48c041033ec07b22fda380daa208ab754ec52b68 Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 19 Mar 2020 11:58:53 +0100 Subject: [PATCH] Provide hint for misspelled -fdump-foo options. gcc/ChangeLog: 2020-03-19 Martin Liska * 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 * gcc.dg/spellcheck-options-22.c: New test. --- gcc/dumpfile.c | 19 ++++++++++++++++--- gcc/dumpfile.h | 2 +- gcc/opts-global.c | 3 +-- gcc/testsuite/gcc.dg/spellcheck-options-22.c | 3 +++ 4 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/spellcheck-options-22.c diff --git a/gcc/dumpfile.c b/gcc/dumpfile.c index e392ecf307c..54718784fd4 100644 --- a/gcc/dumpfile.c +++ b/gcc/dumpfile.c @@ -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 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 diff --git a/gcc/dumpfile.h b/gcc/dumpfile.h index 840ae4d55d5..00e175a4737 100644 --- a/gcc/dumpfile.h +++ b/gcc/dumpfile.h @@ -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 diff --git a/gcc/opts-global.c b/gcc/opts-global.c index c658805470e..b1a8429dc3c 100644 --- a/gcc/opts-global.c +++ b/gcc/opts-global.c @@ -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 index 00000000000..b0ddae2e78e --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-options-22.c @@ -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 } */ -- 2.30.2