c++: Hash table iteration for namespace-member spelling suggestions
authorNathan Sidwell <nathan@acm.org>
Fri, 2 Oct 2020 18:13:26 +0000 (11:13 -0700)
committerNathan Sidwell <nathan@acm.org>
Fri, 2 Oct 2020 18:22:42 +0000 (11:22 -0700)
commit7ee1c0413e251ff0b6a6d526209ef038b9835320
tree81c76e02ae7706afc52b305cdfc3fc0cd738b77f
parent9340d1c97b8a7aa47aff677f9b6db4799670f47b
c++: Hash table iteration for namespace-member spelling suggestions

For 'no such binding' errors, we iterate over binding levels to find a
close match.  At the namespace level we were using DECL_ANTICIPATED to
skip undeclared builtins.  But (a) there are other unnameable things
there and (b) decl-anticipated is about to go away.  This changes the
namespace scanning to iterate over the hash table, and look at
non-hidden bindings.  This does mean we look at fewer strings
(hurrarh), but the order we meet them is somewhat 'random'.  Our
distance measure is not very fine grained, and a couple of testcases
change their suggestion.  I notice for the c/c++ common one, we now
match the output of the C compiler.  For the other one we think 'int'
and 'int64_t' have the same distance from 'int64', and now meet the
former first.  That's a little unfortunate.  If it's too problematic I
suppose we could sort the strings via an intermediate array before
measuring distance.

gcc/cp/
* name-lookup.c (consider_decl): New, broken out of ...
(consider_binding_level): ... here.  Iterate the hash table for
namespace bindings.
gcc/testsuite/
* c-c++-common/spellcheck-reserved.c: Adjust diagnostic.
* g++.dg/spellcheck-typenames.C: Adjust diagnostic.
gcc/cp/name-lookup.c
gcc/testsuite/c-c++-common/spellcheck-reserved.c
gcc/testsuite/g++.dg/spellcheck-typenames.C