opts: improve option suggestion

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.

	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.
This commit is contained in:
Martin Liska 2022-05-11 16:07:25 +02:00
parent b18e5d7e5f
commit ab66fd016d
2 changed files with 30 additions and 3 deletions

View file

@ -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. */

View file

@ -128,11 +128,29 @@ 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 that inserts a trailing '=',
so that for
"-ftrivial-auto-var-init"
we suggest
"-ftrivial-auto-var-init="
rather than
"-Wtrivial-auto-var-init". */
/* 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;