[PR c++/84970] lookup marking
authorNathan Sidwell <nathan@acm.org>
Tue, 20 Mar 2018 15:57:30 +0000 (15:57 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 20 Mar 2018 15:57:30 +0000 (15:57 +0000)
https://gcc.gnu.org/ml/gcc-patches/2018-03/msg00973.html
PR c++/84970
* cp-tree.h (lookup_list_keep): Declare.
* tree.c (lookup_list_keep): New, broken out of ...
(build_min): ... here.  Call it.
* decl.c (cp_finish_decl): Call lookup_list_keep.

PR c++/84970
* g++.dg/lookup/pr84970.C: New.

From-SVN: r258685

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lookup/pr84970.C [new file with mode: 0644]

index fd7329f06222cd241f9832041b29ff34449a4596..7ce79d3862b8c5c9527b1bd28130a3a2fa5d0a39 100644 (file)
@@ -1,3 +1,11 @@
+2018-03-20  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/84970
+       * cp-tree.h (lookup_list_keep): Declare.
+       * tree.c (lookup_list_keep): New, broken out of ...
+       (build_min): ... here.  Call it.
+       * decl.c (cp_finish_decl): Call lookup_list_keep.
+
 2018-03-19  Jason Merrill  <jason@redhat.com>
 
        PR c++/84937 - ICE with class deduction and auto.
index 727822e36da64251392b27eb9df053323d6d109f..077ef2d13f998a6b8f91b2a570a85870f8c66b7e 100644 (file)
@@ -7012,6 +7012,7 @@ extern tree lookup_add                            (tree fns, tree lookup);
 extern tree lookup_maybe_add                   (tree fns, tree lookup,
                                                 bool deduping);
 extern void lookup_keep                                (tree lookup, bool keep);
+extern void lookup_list_keep                   (tree list, bool keep);
 extern int is_overloaded_fn                    (tree) ATTRIBUTE_PURE;
 extern bool really_overloaded_fn               (tree) ATTRIBUTE_PURE;
 extern tree dependent_name                     (tree);
index 546468bf79f790552bda281ed5d5a51f3be25b0c..5f181a5da723f49bda203822a35d443342393a73 100644 (file)
@@ -7034,7 +7034,11 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
        }
 
       if (init)
-       DECL_INITIAL (decl) = init;
+       {
+         if (TREE_CODE (init) == TREE_LIST)
+           lookup_list_keep (init, true);
+         DECL_INITIAL (decl) = init;
+       }
       if (dep_init)
        {
          retrofit_lang_decl (decl);
index 90fbe183b97dab5611ab0ecfeaab93f939954ce9..5993633cbe580b9d96f3f7eb17313075649ea9f0 100644 (file)
@@ -2436,6 +2436,20 @@ lookup_keep (tree lookup, bool keep)
     ovl_used (lookup);
 }
 
+/* LIST is a TREE_LIST whose TREE_VALUEs may be OVERLOADS that need
+   keeping, or may be ignored.  */
+
+void
+lookup_list_keep (tree list, bool keep)
+{
+  for (; list; list = TREE_CHAIN (list))
+    {
+      tree v = TREE_VALUE (list);
+      if (TREE_CODE (v) == OVERLOAD)
+       lookup_keep (v, keep);
+    }
+}
+
 /* Returns nonzero if X is an expression for a (possibly overloaded)
    function.  If "f" is a function or function template, "f", "c->f",
    "c.f", "C::f", and "f<int>" will all be considered possibly
@@ -3315,9 +3329,7 @@ build_min (enum tree_code code, tree tt, ...)
 
   if (code == CAST_EXPR)
     /* The single operand is a TREE_LIST, which we have to check.  */
-    for (tree v = TREE_OPERAND (t, 0); v; v = TREE_CHAIN (v))
-      if (TREE_CODE (TREE_VALUE (v)) == OVERLOAD)
-       lookup_keep (TREE_VALUE (v), true);
+    lookup_list_keep (TREE_OPERAND (t, 0), true);
 
   return t;
 }
index f88a09842fa2846afb6c3b52e24dfd10e6892a5a..14c775ba191988d2959f407f1985cf04a43c8af7 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-20  Nathan Sidwell  <nathan@acm.org>
+
+       PR c++/84970
+       * g++.dg/lookup/pr84970.C: New.
+
 2018-03-20  Richard Biener  <rguenther@suse.de>
 
        PR target/84986
diff --git a/gcc/testsuite/g++.dg/lookup/pr84970.C b/gcc/testsuite/g++.dg/lookup/pr84970.C
new file mode 100644 (file)
index 0000000..ad02248
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/84970 ICE with deferred initializer
+
+namespace bob {
+  void a();
+}
+using namespace bob;
+
+void a (int);
+
+template <typename b>
+void *x (b)
+{
+  void (*c)(b) (a);
+
+  return (void *)c;
+}
+
+void d () {
+  x (1);
+}
+