diff mbox series

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

Message ID 1550186624-25444-3-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series [1/7] Don't offer suggestions for compiler-generated variables (PR c++/85515) | expand

Commit Message

David Malcolm Feb. 14, 2019, 11:23 p.m. UTC
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.

gcc/cp/ChangeLog:
	Backport of r262199 from trunk.
	2018-06-27  David Malcolm  <dmalcolm@redhat.com>

	PR c++/86329
	* name-lookup.c (consider_binding_level): Filter out names that
	match anon_aggrname_p.

gcc/testsuite/ChangeLog:
	Backport of r262199 from trunk.
	2018-06-27  David Malcolm  <dmalcolm@redhat.com>

	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 mbox series

Patch

diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 86fa03b..4e8263b 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -5873,6 +5873,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 }
+}