re PR middle-end/20635 (ICE in cgraph_mark_reachable_node)
authorJan Hubicka <jh@suse.cz>
Mon, 28 Mar 2005 14:10:05 +0000 (16:10 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 28 Mar 2005 14:10:05 +0000 (14:10 +0000)
PR middle-end/20635
* varasm.c (mark_decl_referenced): Do not mark extern inline functions
as needed.

* compile/gcc.c-torture/compile/20050328-1.c: New testcase made
by Jakub Jelinek.

From-SVN: r97133

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20050328-1.c [new file with mode: 0644]
gcc/varasm.c

index 33a60b1b93b9dc88ff823105a89f9050a8563b06..c07d3c436003dedb33b66455cbf98b246269bfde 100644 (file)
@@ -1,5 +1,9 @@
 2005-03-28  Jan Hubicka  <jh@suse.cz>
 
+       PR middle-end/20635
+       * varasm.c (mark_decl_referenced): Do not mark extern inline functions
+       as needed.
+
        * tree-inline.c (estimate_num_insns_1): Use declaration to discover argument
        types where possible.
 
index 447cf20a20e0e76eacd19d1201f74bd54c5cf977..9e7efa7f4d8f64cd559b7d7fb5f694ebf662906f 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-28  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/20635
+       * compile/gcc.c-torture/compile/20050328-1.c: New testcase made
+       by Jakub Jelinek.
+
 2005-03-27  Dorit Naishlos  <dorit@il.ibm.com>
 
        PR tree-optimization/20626
diff --git a/gcc/testsuite/gcc.c-torture/compile/20050328-1.c b/gcc/testsuite/gcc.c-torture/compile/20050328-1.c
new file mode 100644 (file)
index 0000000..a68574f
--- /dev/null
@@ -0,0 +1,24 @@
+void fn1 (void *);
+void fn2 (void *);
+void foo (void);
+void bar (void);
+
+extern inline void *
+baz (void)
+{
+  return 0;
+}
+
+void
+foo (void)
+{
+  fn1 (baz ());
+  fn2 (baz ());
+}
+
+void
+bar (void)
+{
+  fn1 (baz ());
+  fn2 (baz);
+}
index 9a04cd51ab32afba0e6a23224daedd12ddf9eea3..c174eb4141462d3363b2090540fc64e270e47403 100644 (file)
@@ -1877,7 +1877,11 @@ void
 mark_decl_referenced (tree decl)
 {
   if (TREE_CODE (decl) == FUNCTION_DECL)
-    cgraph_mark_needed_node (cgraph_node (decl));
+    {
+      /* Extern inline functions don't become needed when referenced.  */
+      if (!DECL_EXTERNAL (decl))
+        cgraph_mark_needed_node (cgraph_node (decl));
+    }
   else if (TREE_CODE (decl) == VAR_DECL)
     cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
   /* else do nothing - we can get various sorts of CST nodes here,