From: David Malcolm Date: Wed, 27 Jun 2018 23:21:46 +0000 (+0000) Subject: C++: don't offer bogus "._0" suggestions (PR c++/86329) X-Git-Tag: basepoints/gcc-10~5660 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5da1234bb7aaf95dd7e3b5e5438cd92be95daf0f;p=thirdparty%2Fgcc.git C++: don't offer bogus "._0" suggestions (PR c++/86329) PR c++/86329 reports that the C++ frontend can offer bogus suggestions like: #include 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. 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. From-SVN: r262199 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 05383b6003ab..040a84d02169 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-06-27 David Malcolm + + PR c++/86329 + * name-lookup.c (consider_binding_level): Filter out names that + match anon_aggrname_p. + 2018-06-27 Jason Merrill * name-lookup.c (do_pushtag): If we skip a class level, also skip diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index e0500d830711..3aafb0f0ccf8 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -5786,6 +5786,11 @@ consider_binding_level (tree name, best_match &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/ChangeLog b/gcc/testsuite/ChangeLog index e9e2e2a77680..3b33d2051f00 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-06-27 David Malcolm + + PR c++/86329 + * g++.dg/lookup/pr86329.C: New test. + 2018-06-27 Carl Love Add test case that was supposed to be added in commit 255556 on 2017-12-11. diff --git a/gcc/testsuite/g++.dg/lookup/pr86329.C b/gcc/testsuite/g++.dg/lookup/pr86329.C new file mode 100644 index 000000000000..fc091ba35de6 --- /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 } +}