From patchwork Mon Jun 27 23:10:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Malcolm X-Patchwork-Id: 641256 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rdkWZ3wF6z9sCk for ; Tue, 28 Jun 2016 08:44:08 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=J3UHQBfk; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; q=dns; s=default; b=D0qg49IY7JEE axcYakNStoP+ZkzXr2ltdtvyf5fFznxcQMSNDd5fAwnMy+1wFpxzMgWDCmoDoJBW s0GNMuUa2Qef0rboyrhX4aFVMNtjT7oxU8pQXBrT3nZpyCazlHcPmwgwTLNPb4bC St3kVleAqLDbFok5i0q6JsDh3G0sCoA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id; s=default; bh=5BQnBlwL71QARdJAWk TukTZ7hmw=; b=J3UHQBfkcXVEzRcXjMJAHJkzWKq+kUm4dkctsyfmhXkMuoiiGg obrAnRMmYLCbdFqp23DHMAfo0izJsjT6WgCvNscUrKXhjPxjxBFVERuz1NVVEBNF SIPSKvCwa7bO+Cv/8B/r96A8ujqDqze2tCKv4Gy1qgzJDiHHc+NQ3RI7c= Received: (qmail 12947 invoked by alias); 27 Jun 2016 22:43:59 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 12933 invoked by uid 89); 27 Jun 2016 22:43:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=dg-error, dgerror, closest, ENUM X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 27 Jun 2016 22:43:56 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A5DAF80E4A for ; Mon, 27 Jun 2016 22:43:54 +0000 (UTC) Received: from c64.redhat.com (vpn-225-48.phx2.redhat.com [10.3.225.48]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u5RMhrpI008363; Mon, 27 Jun 2016 18:43:54 -0400 From: David Malcolm To: gcc-patches@gcc.gnu.org Cc: David Malcolm Subject: [PATCH] Offer suggestions for misspelled --param names. Date: Mon, 27 Jun 2016 19:10:52 -0400 Message-Id: <1467069052-46369-1-git-send-email-dmalcolm@redhat.com> X-IsSubscribed: yes Another use of spellcheck.{c|h}, this time for --param. Successfully bootstrapped®retested on x86_64-pc-linux-gnu; adds 4 PASS results to gcc.sum. OK for trunk? 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): Move to... * spellcheck.h (struct edit_distance_traits): ...here. gcc/testsuite/ChangeLog: * gcc.dg/spellcheck-params.c: New testcase. * gcc.dg/spellcheck-params-2.c: New testcase. --- gcc/opts.c | 9 ++++++++- gcc/params.c | 14 ++++++++++++++ gcc/params.h | 1 + gcc/spellcheck.c | 18 ------------------ gcc/spellcheck.h | 18 ++++++++++++++++++ gcc/testsuite/gcc.dg/spellcheck-params-2.c | 4 ++++ gcc/testsuite/gcc.dg/spellcheck-params.c | 4 ++++ 7 files changed, 49 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/spellcheck-params-2.c create mode 100644 gcc/testsuite/gcc.dg/spellcheck-params.c diff --git a/gcc/opts.c b/gcc/opts.c index 7406210..f09c520 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -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)) diff --git a/gcc/params.c b/gcc/params.c index 41660b4..1b5000b 100644 --- a/gcc/params.c +++ b/gcc/params.c @@ -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 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. */ diff --git a/gcc/params.h b/gcc/params.h index 7221ab6..97c8d56 100644 --- a/gcc/params.h +++ b/gcc/params.h @@ -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. */ diff --git a/gcc/spellcheck.c b/gcc/spellcheck.c index 2648f3a..b37b1e4 100644 --- a/gcc/spellcheck.c +++ b/gcc/spellcheck.c @@ -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 -{ - 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 diff --git a/gcc/spellcheck.h b/gcc/spellcheck.h index 035f4ac..b48cfbc 100644 --- a/gcc/spellcheck.h +++ b/gcc/spellcheck.h @@ -48,6 +48,24 @@ find_closest_string (const char *target, template struct edit_distance_traits {}; +/* Specialization of edit_distance_traits for C-style strings. */ + +template <> +struct edit_distance_traits +{ + 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 diff --git a/gcc/testsuite/gcc.dg/spellcheck-params-2.c b/gcc/testsuite/gcc.dg/spellcheck-params-2.c new file mode 100644 index 0000000..27e293f --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-params-2.c @@ -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 index 0000000..1bb7bca --- /dev/null +++ b/gcc/testsuite/gcc.dg/spellcheck-params.c @@ -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 } */ +