diff options
author | Martin Liska <mliska@suse.cz> | 2022-05-11 16:07:25 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2022-06-16 08:23:06 +0200 |
commit | ab66fd016d8efa250c471692f826b07e4a55e237 (patch) | |
tree | 45b33fca45bceb9bdb8900bc8d3e9fa25b2346cc /gcc | |
parent | b18e5d7e5f9df69759f0fbc2bed91d5e51313e79 (diff) | |
download | gcc-ab66fd016d8efa250c471692f826b07e4a55e237.zip gcc-ab66fd016d8efa250c471692f826b07e4a55e237.tar.gz gcc-ab66fd016d8efa250c471692f826b07e4a55e237.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/spellcheck.cc | 9 | ||||
-rw-r--r-- | gcc/spellcheck.h | 24 |
2 files changed, 30 insertions, 3 deletions
diff --git a/gcc/spellcheck.cc b/gcc/spellcheck.cc index c7bb012..6930c0e 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 9b62236..3706de3 100644 --- a/gcc/spellcheck.h +++ b/gcc/spellcheck.h @@ -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; |