Message ID | cb941644-5b55-970e-fd31-c6d179e2f66f@suse.cz |
---|---|
State | New |
Headers |
Return-Path: <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 93822383541D for <patchwork@sourceware.org>; Wed, 11 May 2022 14:49:46 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id 93836386EC38 for <gcc-patches@gcc.gnu.org>; Wed, 11 May 2022 14:49:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 93836386EC38 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.cz Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 6806621D13; Wed, 11 May 2022 14:49:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_rsa; t=1652280569; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xkg377GKW+iPU0N7SVx1u8jNqB92YyPtFyhMbY+QPl8=; b=iYoBI4VSc0yfYOJbDSci/dlp6gRxRTqBLhsxJ22aF9MrY5QIqKj2csCBtIv0LLmjaGdzyS Ywkn6whNjqX5cvf9coHixHNmVa1FAzH7aI4AFKF+P9uhB7ESrsGQrjFFZliZZhTHZEsg69 D1jAGQYZCWIVmokf6kCDR13Z8DLCDQk= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.cz; s=susede2_ed25519; t=1652280569; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=xkg377GKW+iPU0N7SVx1u8jNqB92YyPtFyhMbY+QPl8=; b=AkeAPEJNDRc4NbyuoLyVn+yDRySJBL3TuYcrh+yRuch/V9vav8B1BMGybO1yMToCXytkqj dNMqvlkmualVdUDg== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 55889139F9; Wed, 11 May 2022 14:49:29 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id +X3WE/nMe2IHKAAAMHmgww (envelope-from <mliska@suse.cz>); Wed, 11 May 2022 14:49:29 +0000 Message-ID: <cb941644-5b55-970e-fd31-c6d179e2f66f@suse.cz> Date: Wed, 11 May 2022 16:49:28 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 From: =?utf-8?q?Martin_Li=C5=A1ka?= <mliska@suse.cz> Subject: [PATCH] opts: improve option suggestion To: gcc-patches@gcc.gnu.org Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org> |
Series |
opts: improve option suggestion
|
|
Commit Message
Martin Liška
May 11, 2022, 2:49 p.m. UTC
In case where we have 2 equally good candidates like -ftrivial-auto-var-init= -Wtrivial-auto-var-init for -ftrivial-auto-var-init, we should take the candidate that has a difference in trailing sign symbol. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin PR driver/105564 gcc/ChangeLog: * spellcheck.cc (test_find_closest_string): Add new test. * spellcheck.h (class best_match): Prefer a difference in trailing sign symbol. --- gcc/spellcheck.cc | 9 +++++++++ gcc/spellcheck.h | 17 ++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-)
Comments
On Wed, 2022-05-11 at 16:49 +0200, Martin Liška wrote: > In case where we have 2 equally good candidates like > -ftrivial-auto-var-init= > -Wtrivial-auto-var-init > > for -ftrivial-auto-var-init, we should take the candidate that > has a difference in trailing sign symbol. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed? > Thanks, > Martin > > PR driver/105564 > > gcc/ChangeLog: > > * spellcheck.cc (test_find_closest_string): Add new test. > * spellcheck.h (class best_match): Prefer a difference in > trailing sign symbol. > --- > gcc/spellcheck.cc | 9 +++++++++ > gcc/spellcheck.h | 17 ++++++++++++++--- > 2 files changed, 23 insertions(+), 3 deletions(-) > > diff --git a/gcc/spellcheck.cc b/gcc/spellcheck.cc > index 3e58344f510..f728573331f 100644 > --- a/gcc/spellcheck.cc > +++ b/gcc/spellcheck.cc > @@ -464,6 +464,15 @@ test_find_closest_string () > ASSERT_STREQ ("DWARF_GNAT_ENCODINGS_ALL", > find_closest_string ("DWARF_GNAT_ENCODINGS_all", > &candidates)); > + > + /* Example from PR 105564 where option name with missing equal > + sign should win. */ > + candidates.truncate (0); > + candidates.safe_push ("-Wtrivial-auto-var-init"); > + candidates.safe_push ("-ftrivial-auto-var-init="); > + ASSERT_STREQ ("-ftrivial-auto-var-init=", > + find_closest_string ("-ftrivial-auto-var-init", > + &candidates)); > } > > /* Test data for test_metric_conditions. */ > diff --git a/gcc/spellcheck.h b/gcc/spellcheck.h > index 9b6223695be..9111ea08fc3 100644 > --- a/gcc/spellcheck.h > +++ b/gcc/spellcheck.h > @@ -128,11 +128,22 @@ class best_match > > /* Otherwise, compute the distance and see if the candidate > has beaten the previous best value. */ > + const char *candidate_str = candidate_traits::get_string > (candidate); > edit_distance_t dist > - = get_edit_distance (m_goal, m_goal_len, > - candidate_traits::get_string (candidate), > - candidate_len); > + = get_edit_distance (m_goal, m_goal_len, candidate_str, > candidate_len); > + > + bool is_better = false; > if (dist < m_best_distance) > + is_better = true; > + else if (dist == m_best_distance) > + { > + /* Prefer a candidate has a difference in trailing sign > character. */ > + if (candidate_str[candidate_len - 1] == '=' > + && m_goal[m_goal_len - 1] != '=') > + is_better = true; > + } Thanks for working on this. Maybe the comment should read: /* Prefer a candidate that inserts a trailing '=', so that for "-ftrivial-auto-var-init" we suggest "-ftrivial-auto-var-init=" rather than "-Wtrivial-auto-var-init". */ Is the logic correct? It's comparing the candidate with the goal, rather than with the current best. What if both the candidate and the current best both add a trailing equal sign? I find the array access of the final character suspicious - is there any chance that either of the lengths could be zero? I don't think so, but maybe we should bulletproof things, and move the "is better" comparison to a subroutine? Hope this is constructive Dave > + > + if (is_better) > { > m_best_distance = dist; > m_best_candidate = candidate;
On Wed, May 11, 2022 at 8:50 PM David Malcolm via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > On Wed, 2022-05-11 at 16:49 +0200, Martin Liška wrote: > > In case where we have 2 equally good candidates like > > -ftrivial-auto-var-init= > > -Wtrivial-auto-var-init > > > > for -ftrivial-auto-var-init, we should take the candidate that > > has a difference in trailing sign symbol. > > > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > > > Ready to be installed? > > Thanks, > > Martin > > > > PR driver/105564 > > > > gcc/ChangeLog: > > > > * spellcheck.cc (test_find_closest_string): Add new test. > > * spellcheck.h (class best_match): Prefer a difference in > > trailing sign symbol. > > --- > > gcc/spellcheck.cc | 9 +++++++++ > > gcc/spellcheck.h | 17 ++++++++++++++--- > > 2 files changed, 23 insertions(+), 3 deletions(-) > > > > diff --git a/gcc/spellcheck.cc b/gcc/spellcheck.cc > > index 3e58344f510..f728573331f 100644 > > --- a/gcc/spellcheck.cc > > +++ b/gcc/spellcheck.cc > > @@ -464,6 +464,15 @@ test_find_closest_string () > > ASSERT_STREQ ("DWARF_GNAT_ENCODINGS_ALL", > > find_closest_string ("DWARF_GNAT_ENCODINGS_all", > > &candidates)); > > + > > + /* Example from PR 105564 where option name with missing equal > > + sign should win. */ > > + candidates.truncate (0); > > + candidates.safe_push ("-Wtrivial-auto-var-init"); > > + candidates.safe_push ("-ftrivial-auto-var-init="); > > + ASSERT_STREQ ("-ftrivial-auto-var-init=", > > + find_closest_string ("-ftrivial-auto-var-init", > > + &candidates)); > > } > > > > /* Test data for test_metric_conditions. */ > > diff --git a/gcc/spellcheck.h b/gcc/spellcheck.h > > index 9b6223695be..9111ea08fc3 100644 > > --- a/gcc/spellcheck.h > > +++ b/gcc/spellcheck.h > > @@ -128,11 +128,22 @@ class best_match > > > > /* Otherwise, compute the distance and see if the candidate > > has beaten the previous best value. */ > > + const char *candidate_str = candidate_traits::get_string > > (candidate); > > edit_distance_t dist > > - = get_edit_distance (m_goal, m_goal_len, > > - candidate_traits::get_string (candidate), > > - candidate_len); > > + = get_edit_distance (m_goal, m_goal_len, candidate_str, > > candidate_len); > > + > > + bool is_better = false; > > if (dist < m_best_distance) > > + is_better = true; > > + else if (dist == m_best_distance) > > + { > > + /* Prefer a candidate has a difference in trailing sign > > character. */ > > + if (candidate_str[candidate_len - 1] == '=' > > + && m_goal[m_goal_len - 1] != '=') > > + is_better = true; > > + } > > Thanks for working on this. > > Maybe the comment should read: > > /* Prefer a candidate that inserts a trailing '=', > so that for > "-ftrivial-auto-var-init" > we suggest > "-ftrivial-auto-var-init=" > rather than > "-Wtrivial-auto-var-init". */ > > Is the logic correct? It's comparing the candidate with the goal, > rather than with the current best. What if both the candidate and the > current best both add a trailing equal sign? > > I find the array access of the final character suspicious - is there > any chance that either of the lengths could be zero? I don't think so, > but maybe we should bulletproof things, and move the "is better" > comparison to a subroutine? I think for this case the logic would be to prefer to stick to the -W or -f _prefix_ the user gave and give that a "boost" so we do not suggest an optimization option for a warning one. That is, when given -Wfoo we should not suggest -ffoo-bar but -Wfoo-longbar (just made up example), even if the -ffoo-bar looks a much better match. But maybe that's better handled by better selecting the initial candidate set rather than doing the last disambiguation. Richard. > Hope this is constructive > Dave > > > + > > + if (is_better) > > { > > m_best_distance = dist; > > m_best_candidate = candidate; > >
On 5/11/22 20:49, David Malcolm wrote: > On Wed, 2022-05-11 at 16:49 +0200, Martin Liška wrote: >> In case where we have 2 equally good candidates like >> -ftrivial-auto-var-init= >> -Wtrivial-auto-var-init >> >> for -ftrivial-auto-var-init, we should take the candidate that >> has a difference in trailing sign symbol. >> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >> >> Ready to be installed? >> Thanks, >> Martin >> >> PR driver/105564 >> >> gcc/ChangeLog: >> >> * spellcheck.cc (test_find_closest_string): Add new test. >> * spellcheck.h (class best_match): Prefer a difference in >> trailing sign symbol. >> --- >> gcc/spellcheck.cc | 9 +++++++++ >> gcc/spellcheck.h | 17 ++++++++++++++--- >> 2 files changed, 23 insertions(+), 3 deletions(-) >> >> diff --git a/gcc/spellcheck.cc b/gcc/spellcheck.cc >> index 3e58344f510..f728573331f 100644 >> --- a/gcc/spellcheck.cc >> +++ b/gcc/spellcheck.cc >> @@ -464,6 +464,15 @@ test_find_closest_string () >> ASSERT_STREQ ("DWARF_GNAT_ENCODINGS_ALL", >> find_closest_string ("DWARF_GNAT_ENCODINGS_all", >> &candidates)); >> + >> + /* Example from PR 105564 where option name with missing equal >> + sign should win. */ >> + candidates.truncate (0); >> + candidates.safe_push ("-Wtrivial-auto-var-init"); >> + candidates.safe_push ("-ftrivial-auto-var-init="); >> + ASSERT_STREQ ("-ftrivial-auto-var-init=", >> + find_closest_string ("-ftrivial-auto-var-init", >> + &candidates)); >> } >> >> /* Test data for test_metric_conditions. */ >> diff --git a/gcc/spellcheck.h b/gcc/spellcheck.h >> index 9b6223695be..9111ea08fc3 100644 >> --- a/gcc/spellcheck.h >> +++ b/gcc/spellcheck.h >> @@ -128,11 +128,22 @@ class best_match >> >> /* Otherwise, compute the distance and see if the candidate >> has beaten the previous best value. */ >> + const char *candidate_str = candidate_traits::get_string >> (candidate); >> edit_distance_t dist >> - = get_edit_distance (m_goal, m_goal_len, >> - candidate_traits::get_string (candidate), >> - candidate_len); >> + = get_edit_distance (m_goal, m_goal_len, candidate_str, >> candidate_len); >> + >> + bool is_better = false; >> if (dist < m_best_distance) >> + is_better = true; >> + else if (dist == m_best_distance) >> + { >> + /* Prefer a candidate has a difference in trailing sign >> character. */ >> + if (candidate_str[candidate_len - 1] == '=' >> + && m_goal[m_goal_len - 1] != '=') >> + is_better = true; >> + } > > Thanks for working on this. > > Maybe the comment should read: > > /* Prefer a candidate that inserts a trailing '=', > so that for > "-ftrivial-auto-var-init" > we suggest > "-ftrivial-auto-var-init=" > rather than > "-Wtrivial-auto-var-init". */ I welcome the comment suggestion. > > Is the logic correct? It's comparing the candidate with the goal, > rather than with the current best. Yes, that's basically saying that there's a difference in the trailing sign char. > What if both the candidate and the > current best both add a trailing equal sign? Then there's a difference somewhere else, and we would follow edit_distance_t. > > I find the array access of the final character suspicious - is there > any chance that either of the lengths could be zero? I don't think so, > but maybe we should bulletproof things, and move the "is better" > comparison to a subroutine? I think one can't have empty string here. Sending updated version of the patch where I added the comment. Ready to be installed? Thanks, Martin > > Hope this is constructive > Dave > >> + >> + if (is_better) >> { >> m_best_distance = dist; >> m_best_candidate = candidate; > >
PING^1 On 5/12/22 09:10, Martin Liška wrote: > On 5/11/22 20:49, David Malcolm wrote: >> On Wed, 2022-05-11 at 16:49 +0200, Martin Liška wrote: >>> In case where we have 2 equally good candidates like >>> -ftrivial-auto-var-init= >>> -Wtrivial-auto-var-init >>> >>> for -ftrivial-auto-var-init, we should take the candidate that >>> has a difference in trailing sign symbol. >>> >>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >>> >>> Ready to be installed? >>> Thanks, >>> Martin >>> >>> PR driver/105564 >>> >>> gcc/ChangeLog: >>> >>> * spellcheck.cc (test_find_closest_string): Add new test. >>> * spellcheck.h (class best_match): Prefer a difference in >>> trailing sign symbol. >>> --- >>> gcc/spellcheck.cc | 9 +++++++++ >>> gcc/spellcheck.h | 17 ++++++++++++++--- >>> 2 files changed, 23 insertions(+), 3 deletions(-) >>> >>> diff --git a/gcc/spellcheck.cc b/gcc/spellcheck.cc >>> index 3e58344f510..f728573331f 100644 >>> --- a/gcc/spellcheck.cc >>> +++ b/gcc/spellcheck.cc >>> @@ -464,6 +464,15 @@ test_find_closest_string () >>> ASSERT_STREQ ("DWARF_GNAT_ENCODINGS_ALL", >>> find_closest_string ("DWARF_GNAT_ENCODINGS_all", >>> &candidates)); >>> + >>> + /* Example from PR 105564 where option name with missing equal >>> + sign should win. */ >>> + candidates.truncate (0); >>> + candidates.safe_push ("-Wtrivial-auto-var-init"); >>> + candidates.safe_push ("-ftrivial-auto-var-init="); >>> + ASSERT_STREQ ("-ftrivial-auto-var-init=", >>> + find_closest_string ("-ftrivial-auto-var-init", >>> + &candidates)); >>> } >>> >>> /* Test data for test_metric_conditions. */ >>> diff --git a/gcc/spellcheck.h b/gcc/spellcheck.h >>> index 9b6223695be..9111ea08fc3 100644 >>> --- a/gcc/spellcheck.h >>> +++ b/gcc/spellcheck.h >>> @@ -128,11 +128,22 @@ class best_match >>> >>> /* Otherwise, compute the distance and see if the candidate >>> has beaten the previous best value. */ >>> + const char *candidate_str = candidate_traits::get_string >>> (candidate); >>> edit_distance_t dist >>> - = get_edit_distance (m_goal, m_goal_len, >>> - candidate_traits::get_string (candidate), >>> - candidate_len); >>> + = get_edit_distance (m_goal, m_goal_len, candidate_str, >>> candidate_len); >>> + >>> + bool is_better = false; >>> if (dist < m_best_distance) >>> + is_better = true; >>> + else if (dist == m_best_distance) >>> + { >>> + /* Prefer a candidate has a difference in trailing sign >>> character. */ >>> + if (candidate_str[candidate_len - 1] == '=' >>> + && m_goal[m_goal_len - 1] != '=') >>> + is_better = true; >>> + } >> >> Thanks for working on this. >> >> Maybe the comment should read: >> >> /* Prefer a candidate that inserts a trailing '=', >> so that for >> "-ftrivial-auto-var-init" >> we suggest >> "-ftrivial-auto-var-init=" >> rather than >> "-Wtrivial-auto-var-init". */ > > I welcome the comment suggestion. > >> >> Is the logic correct? It's comparing the candidate with the goal, >> rather than with the current best. > > Yes, that's basically saying that there's a difference in the trailing sign char. > >> What if both the candidate and the >> current best both add a trailing equal sign? > > Then there's a difference somewhere else, and we would follow edit_distance_t. > >> >> I find the array access of the final character suspicious - is there >> any chance that either of the lengths could be zero? I don't think so, >> but maybe we should bulletproof things, and move the "is better" >> comparison to a subroutine? > > I think one can't have empty string here. > > Sending updated version of the patch where I added the comment. > > Ready to be installed? > Thanks, > Martin > >> >> Hope this is constructive >> Dave >> >>> + >>> + if (is_better) >>> { >>> m_best_distance = dist; >>> m_best_candidate = candidate; >> >>
On 5/24/2022 2:45 AM, Martin Liška wrote: > PING^1 > > On 5/12/22 09:10, Martin Liška wrote: >> On 5/11/22 20:49, David Malcolm wrote: >>> On Wed, 2022-05-11 at 16:49 +0200, Martin Liška wrote: >>>> In case where we have 2 equally good candidates like >>>> -ftrivial-auto-var-init= >>>> -Wtrivial-auto-var-init >>>> >>>> for -ftrivial-auto-var-init, we should take the candidate that >>>> has a difference in trailing sign symbol. >>>> >>>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >>>> >>>> Ready to be installed? >>>> Thanks, >>>> Martin >>>> >>>> PR driver/105564 >>>> >>>> gcc/ChangeLog: >>>> >>>> * spellcheck.cc (test_find_closest_string): Add new test. >>>> * spellcheck.h (class best_match): Prefer a difference in >>>> trailing sign symbol. OK jeff
diff --git a/gcc/spellcheck.cc b/gcc/spellcheck.cc index 3e58344f510..f728573331f 100644 --- a/gcc/spellcheck.cc +++ b/gcc/spellcheck.cc @@ -464,6 +464,15 @@ test_find_closest_string () ASSERT_STREQ ("DWARF_GNAT_ENCODINGS_ALL", find_closest_string ("DWARF_GNAT_ENCODINGS_all", &candidates)); + + /* Example from PR 105564 where option name with missing equal + sign should win. */ + candidates.truncate (0); + candidates.safe_push ("-Wtrivial-auto-var-init"); + candidates.safe_push ("-ftrivial-auto-var-init="); + ASSERT_STREQ ("-ftrivial-auto-var-init=", + find_closest_string ("-ftrivial-auto-var-init", + &candidates)); } /* Test data for test_metric_conditions. */ diff --git a/gcc/spellcheck.h b/gcc/spellcheck.h index 9b6223695be..9111ea08fc3 100644 --- a/gcc/spellcheck.h +++ b/gcc/spellcheck.h @@ -128,11 +128,22 @@ class best_match /* Otherwise, compute the distance and see if the candidate has beaten the previous best value. */ + const char *candidate_str = candidate_traits::get_string (candidate); edit_distance_t dist - = get_edit_distance (m_goal, m_goal_len, - candidate_traits::get_string (candidate), - candidate_len); + = get_edit_distance (m_goal, m_goal_len, candidate_str, candidate_len); + + bool is_better = false; if (dist < m_best_distance) + is_better = true; + else if (dist == m_best_distance) + { + /* Prefer a candidate has a difference in trailing sign character. */ + if (candidate_str[candidate_len - 1] == '=' + && m_goal[m_goal_len - 1] != '=') + is_better = true; + } + + if (is_better) { m_best_distance = dist; m_best_candidate = candidate;