From: Jakub Jelinek Date: Fri, 6 Mar 2009 22:51:28 +0000 (+0100) Subject: re PR middle-end/39360 (ICE in referenced_var_lookup, at tree-dfa.c:563) X-Git-Tag: releases/gcc-4.4.0~338 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=65401a0ba393e9f2b971e9069e0335dc26c8a917;p=thirdparty%2Fgcc.git re PR middle-end/39360 (ICE in referenced_var_lookup, at tree-dfa.c:563) PR middle-end/39360 * tree-flow.h (add_referenced_var): Return bool instead of void. * tree-dfa.c (add_referenced_var): Return result of referenced_var_check_and_insert call. * tree-inline.c (expand_call_inline): Call add_referenced_var instead of referenced_var_check_and_insert. * gcc.c-torture/compile/pr39360.c: New test. From-SVN: r144683 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f6204bf557e5..68bd222fb796 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2009-03-06 Jakub Jelinek + PR middle-end/39360 + * tree-flow.h (add_referenced_var): Return bool instead of void. + * tree-dfa.c (add_referenced_var): Return result of + referenced_var_check_and_insert call. + * tree-inline.c (expand_call_inline): Call add_referenced_var instead + of referenced_var_check_and_insert. + PR debug/39372 * dwarf2out.c (add_abstract_origin_attribute): Return origin_die. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cbc8ae27aaae..c349894213c9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2009-03-06 Jakub Jelinek + PR middle-end/39360 + * gcc.c-torture/compile/pr39360.c: New test. + PR debug/39372 * g++.dg/debug/dwarf2/static-local-var-in-ctor.C: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr39360.c b/gcc/testsuite/gcc.c-torture/compile/pr39360.c new file mode 100644 index 000000000000..0bd63114431c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr39360.c @@ -0,0 +1,16 @@ +/* PR middle-end/39360 */ + +static int a[] = { 1 }; + +static inline void +bar (int **x) +{ + static int *c[2] = { 0, a }; + *x = c[1]; +} + +int +foo (int **x) +{ + bar (x); +} diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index df0be2df134a..5241e64c9292 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -1,6 +1,6 @@ /* Data flow functions for trees. - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 Free Software - Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 + Free Software Foundation, Inc. Contributed by Diego Novillo This file is part of GCC. @@ -639,7 +639,7 @@ set_default_def (tree var, tree def) /* Add VAR to the list of referenced variables if it isn't already there. */ -void +bool add_referenced_var (tree var) { var_ann_t v_ann; @@ -655,7 +655,7 @@ add_referenced_var (tree var) /* Tag's don't have DECL_INITIAL. */ if (MTAG_P (var)) - return; + return true; /* Scan DECL_INITIAL for pointer variables as they may contain address arithmetic referencing the address of other @@ -667,7 +667,11 @@ add_referenced_var (tree var) optimizers. */ && !DECL_EXTERNAL (var)) walk_tree (&DECL_INITIAL (var), find_vars_r, NULL, 0); + + return true; } + + return false; } /* Remove VAR from the list. */ diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 01953b593324..40829675b84c 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -768,7 +768,7 @@ extern void dump_referenced_vars (FILE *); extern void dump_variable (FILE *, tree); extern void debug_variable (tree); extern tree get_virtual_var (tree); -extern void add_referenced_var (tree); +extern bool add_referenced_var (tree); extern void remove_referenced_var (tree); extern void mark_symbols_for_renaming (gimple); extern void find_new_referenced_vars (gimple); diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 63392e21c4bf..917b5267434f 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1,5 +1,5 @@ /* Tree inlining. - Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Contributed by Alexandre Oliva @@ -3383,7 +3383,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) var = TREE_VALUE (t_step); if (TREE_STATIC (var) && !TREE_ASM_WRITTEN (var)) { - if (var_ann (var) && referenced_var_check_and_insert (var)) + if (var_ann (var) && add_referenced_var (var)) cfun->local_decls = tree_cons (NULL_TREE, var, cfun->local_decls); }