OK.
On Wed, Jun 27, 2018 at 3:01 PM, David Malcolm <dmalc...@redhat.com> wrote: > PR c++/86329 reports that the C++ frontend can offer bogus suggestions like: > > #include <string> > > int compare() > { > return __n1 - __n2; > } > > suggested.cc: In function 'int compare()': > suggested.cc:5:10: error: '__n1' was not declared in this scope > return __n1 - __n2; > ^~~~ > suggested.cc:5:10: note: suggested alternative: '._61' > return __n1 - __n2; > ^~~~ > ._61 > suggested.cc:5:17: error: '__n2' was not declared in this scope > return __n1 - __n2; > ^~~~ > suggested.cc:5:17: note: suggested alternative: '._72' > return __n1 - __n2; > ^~~~ > ._72 > > The dot-prefixed names are an implementation detail of how we implement > anonymous enums found in the header files, generated via > anon_aggrname_format in make_anon_name. > > This patch uses anon_aggrname_p to filter them out when considering > which names to suggest. > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu; > adds 9 PASS results to g++.sum > > OK for trunk, gcc-8, gcc-7 branches? > > gcc/cp/ChangeLog: > PR c++/86329 > * name-lookup.c (consider_binding_level): Filter out names that > match anon_aggrname_p. > > gcc/testsuite/ChangeLog: > PR c++/86329 > * g++.dg/lookup/pr86329.C: New test. > --- > gcc/cp/name-lookup.c | 5 +++++ > gcc/testsuite/g++.dg/lookup/pr86329.C | 11 +++++++++++ > 2 files changed, 16 insertions(+) > create mode 100644 gcc/testsuite/g++.dg/lookup/pr86329.C > > diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c > index a30c374..6ec4e6e 100644 > --- a/gcc/cp/name-lookup.c > +++ b/gcc/cp/name-lookup.c > @@ -5786,6 +5786,11 @@ consider_binding_level (tree name, best_match <tree, > const char *> &bm, > if (!suggestion) > continue; > > + /* Don't suggest names that are for anonymous aggregate types, as > + they are an implementation detail generated by the compiler. */ > + if (anon_aggrname_p (suggestion)) > + continue; > + > const char *suggestion_str = IDENTIFIER_POINTER (suggestion); > > /* Ignore internal names with spaces in them. */ > diff --git a/gcc/testsuite/g++.dg/lookup/pr86329.C > b/gcc/testsuite/g++.dg/lookup/pr86329.C > new file mode 100644 > index 0000000..fc091ba > --- /dev/null > +++ b/gcc/testsuite/g++.dg/lookup/pr86329.C > @@ -0,0 +1,11 @@ > +/* PR c++/86329: ensure we don't erroneously offer suggestions like "._0", > + which are an implementation detail of how e.g. anonymous enums are > + handled internally. */ > + > +enum {NONEMPTY}; > + > +int test() > +{ > + return __0; // { dg-error "'__0' was not declared in this scope" } > + // { dg-bogus "suggested alternative" "" { target *-*-* } .-1 } > +} > -- > 1.8.5.3 >