diff options
author | Richard Guenther <rguenther@suse.de> | 2009-01-26 09:52:48 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-01-26 09:52:48 +0000 |
commit | dc874b53e5529e2a76d610500345e1f469366346 (patch) | |
tree | 54ab4727fc6dda034e3318ddcd386ab97f5de48c /gcc | |
parent | 20d4bdcbb1d88647bb05f54d1fdce955e49c25d7 (diff) | |
download | gcc-dc874b53e5529e2a76d610500345e1f469366346.zip gcc-dc874b53e5529e2a76d610500345e1f469366346.tar.gz gcc-dc874b53e5529e2a76d610500345e1f469366346.tar.bz2 |
re PR middle-end/38851 (Compiler warns about uninitialized variable that is an object with a constructor)
2009-01-26 Richard Guenther <rguenther@suse.de>
PR middle-end/38851
* Makefile.in (tree-ssa-dse.o): Add langhooks.h.
* tree-ssa-dse.c: Include langhooks.h
(execute_simple_dse): Remove stores with zero size.
* g++.dg/warn/Wuninitialized-1.C: New testcase.
From-SVN: r143672
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wuninitialized-1.C | 15 | ||||
-rw-r--r-- | gcc/tree-ssa-dse.c | 32 |
5 files changed, 52 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ecf9e46..f9ca880 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-01-26 Richard Guenther <rguenther@suse.de> + + PR middle-end/38851 + * Makefile.in (tree-ssa-dse.o): Add langhooks.h. + * tree-ssa-dse.c: Include langhooks.h + (execute_simple_dse): Remove stores with zero size. + 2009-01-24 Jakub Jelinek <jakub@redhat.com> PR c/38957 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 8b214b9..ab461e7 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2110,7 +2110,7 @@ tree-outof-ssa.o : tree-outof-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \ tree-ssa-dse.o : tree-ssa-dse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \ $(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) domwalk.h $(FLAGS_H) \ - $(DIAGNOSTIC_H) $(TIMEVAR_H) + $(DIAGNOSTIC_H) $(TIMEVAR_H) langhooks.h tree-ssa-forwprop.o : tree-ssa-forwprop.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ $(TM_H) $(GGC_H) $(TREE_H) $(RTL_H) $(TM_P_H) $(BASIC_BLOCK_H) \ $(TREE_FLOW_H) tree-pass.h $(TREE_DUMP_H) $(DIAGNOSTIC_H) $(TIMEVAR_H) \ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d079da9..ea1493a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-01-26 Richard Guenther <rguenther@suse.de> + + PR middle-end/38851 + * g++.dg/warn/Wuninitialized-1.C: New testcase. + 2009-01-25 Hans-Peter Nilsson <hp@axis.com> * gcc.dg/bitfld-15.c: Gate warning on target diff --git a/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C b/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C new file mode 100644 index 0000000..7b1b90b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wuninitialized-1.C @@ -0,0 +1,15 @@ +/* { dg-options "-O2 -Wuninitialized" } */ + +struct Empty { Empty() {} }; /* { dg-bogus "uninitialized" } */ +struct Other { + Other(const Empty& e_) : e(e_) {} + Empty e; +}; +void bar(Other&); +void foo() +{ + Empty e; + Other o(e); + bar(o); +} + diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c index b4be514..8a72495 100644 --- a/gcc/tree-ssa-dse.c +++ b/gcc/tree-ssa-dse.c @@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-dump.h" #include "domwalk.h" #include "flags.h" +#include "langhooks.h" /* This file implements dead store elimination. @@ -660,20 +661,35 @@ execute_simple_dse (void) tree op; bool removed = false; ssa_op_iter iter; + tree size; - if (gimple_stored_syms (stmt) - && !bitmap_empty_p (gimple_stored_syms (stmt)) - && (is_gimple_assign (stmt) - || (is_gimple_call (stmt) - && gimple_call_lhs (stmt))) - && !bitmap_intersect_p (gimple_stored_syms (stmt), variables_loaded)) + if (is_gimple_assign (stmt) + && AGGREGATE_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))) + && (size = lang_hooks.expr_size (gimple_assign_lhs (stmt))) + && integer_zerop (size)) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + { + fprintf (dump_file, " Deleted zero-sized store '"); + print_gimple_stmt (dump_file, stmt, 0, dump_flags); + fprintf (dump_file, "'\n"); + } + removed = true; + gsi_remove (&gsi, true); + todo |= TODO_cleanup_cfg; + } + else if (gimple_stored_syms (stmt) + && !bitmap_empty_p (gimple_stored_syms (stmt)) + && (is_gimple_assign (stmt) + || (is_gimple_call (stmt) + && gimple_call_lhs (stmt))) + && !bitmap_intersect_p (gimple_stored_syms (stmt), + variables_loaded)) { unsigned int i; bitmap_iterator bi; bool dead = true; - - /* See if STMT only stores to write-only variables and verify that there are no volatile operands. tree-ssa-operands sets has_volatile_ops flag for all statements involving |