C++: don't offer bogus "._0" suggestions (PR c++/86329)

Message ID 1530126082-28544-1-git-send-email-dmalcolm@redhat.com
State Superseded
Headers show
Series
  • C++: don't offer bogus "._0" suggestions (PR c++/86329)
Related show

Commit Message

David Malcolm June 27, 2018, 7:01 p.m.
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

-- 
1.8.5.3

Comments

Jason Merrill June 27, 2018, 9:30 p.m. | #1
OK.

On Wed, Jun 27, 2018 at 3:01 PM, David Malcolm <dmalcolm@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

>

Patch

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 }
+}