This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[C++ PATCH] Fix ICE in C++ lookup_name_fuzzy (PR c++/77549)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>, David Malcolm <dmalcolm at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 13 Sep 2016 21:26:18 +0200
- Subject: [C++ PATCH] Fix ICE in C++ lookup_name_fuzzy (PR c++/77549)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
push_local_binding/push_overloaded_decl* sometimes inserts OVERLOADs
into the lvl->names chain, and for both OVERLOADs and decls from using
directive it also wraps them into TREE_LIST.
The following patch teaches the spelling check hints processing to handle
those, otherwise we ICE in each of the 3 cases in the testcase on using
DECL_NAME on TREE_LIST.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2016-09-13 Jakub Jelinek <jakub@redhat.com>
PR c++/77549
* name-lookup.c (consider_binding_level): Look through TREE_LIST
and OVERLOAD.
* g++.dg/lookup/pr77549.C: New test.
--- gcc/cp/name-lookup.c.jj 2016-09-13 13:47:16.000000000 +0200
+++ gcc/cp/name-lookup.c 2016-09-13 13:53:34.874892924 +0200
@@ -4707,6 +4707,14 @@ consider_binding_level (tree name, best_
for (tree t = lvl->names; t; t = TREE_CHAIN (t))
{
+ /* OVERLOADs or decls from using declaration are wrapped into
+ TREE_LIST. */
+ if (TREE_CODE (t) == TREE_LIST)
+ {
+ t = TREE_VALUE (t);
+ t = OVL_CURRENT (t);
+ }
+
/* Don't use bindings from implicitly declared functions,
as they were likely misspellings themselves. */
if (TREE_TYPE (t) == error_mark_node)
--- gcc/testsuite/g++.dg/lookup/pr77549.C.jj 2016-09-13 14:10:04.569743214 +0200
+++ gcc/testsuite/g++.dg/lookup/pr77549.C 2016-09-13 14:08:57.000000000 +0200
@@ -0,0 +1,48 @@
+// PR c++/77549
+// { dg-do compile }
+
+struct A
+{
+ static int x;
+};
+
+void
+f1 ()
+{
+ using ::A;
+ x; // { dg-error "'x' was not declared in this scope" }
+}
+
+namespace N
+{
+ int bar;
+}
+
+void
+f2 ()
+{
+ using N::bar;
+ baz++; // { dg-error "'baz' was not declared in this scope" }
+} // { dg-message "note: suggested alternative: 'bar'" "" { target *-*-* } 25 }
+
+int
+bar ()
+{
+ return 0;
+}
+
+namespace M
+{
+ int
+ bar ()
+ {
+ return 0;
+ }
+}
+
+void
+f3 ()
+{
+ using M::bar;
+ baz (); // { dg-error "'baz' was not declared in this scope" }
+} // { dg-message "note: suggested alternative: 'bar'" "" { target *-*-* } 47 }
Jakub