Commit 8cb3ee37 by Richard Guenther Committed by Richard Biener

re PR tree-optimization/35609 ("is used uninitialized in this function" should be may warning)

2008-03-19  Richard Guenther  <rguenther@suse.de>

	PR middle-end/35609
	* tree-ssa.c (always_executed): New global flag.
	(warn_uninitialized_var): If !always_executed warn with "maybe"
	instead of "is".
	(execute_early_warn_uninitialized): Compute post-dominators.
	Initialize always_executed before processing each basic block.

	* gcc.dg/testsuite/uninit-15.c: New testcase.
	* gcc.dg/testsuite/uninit-16.c: Likewise.

From-SVN: r133341
parent 21c2d075
2008-03-19 Richard Guenther <rguenther@suse.de>
PR middle-end/35609
* tree-ssa.c (always_executed): New global flag.
(warn_uninitialized_var): If !always_executed warn with "maybe"
instead of "is".
(execute_early_warn_uninitialized): Compute post-dominators.
Initialize always_executed before processing each basic block.
2008-03-18 Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
PR target/35504
......
2008-03-19 Richard Guenther <rguenther@suse.de>
PR middle-end/35609
* gcc.dg/testsuite/uninit-15.c: New testcase.
* gcc.dg/testsuite/uninit-16.c: Likewise.
2008-03-18 Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
PR target/35504
/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized" } */
inline int foo (int i)
{
if (i) return 1; /* { dg-warning "is used uninitialized" } */
return 0;
}
void baz();
void bar()
{
int j; /* { dg-message "was declared here" } */
for (; foo(j); ++j)
baz();
}
/* { dg-do compile } */
/* { dg-options "-O2 -Wuninitialized" } */
int foo, bar;
void decode_reloc(int reloc, int *is_alt)
{
if (reloc >= 20)
*is_alt = 1;
else if (reloc >= 10)
*is_alt = 0;
}
void testfunc()
{
int alt_reloc;
decode_reloc(foo, &alt_reloc);
if (alt_reloc) /* { dg-warning "may be used uninitialized" } */
bar = 42;
}
......@@ -1416,13 +1416,19 @@ warn_uninit (tree t, const char *gmsgid, void *data)
TREE_NO_WARNING (var) = 1;
}
struct walk_data {
tree stmt;
bool always_executed;
};
/* Called via walk_tree, look for SSA_NAMEs that have empty definitions
and warn about them. */
static tree
warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data_)
{
struct walk_data *data = (struct walk_data *)data_;
tree t = *tp;
switch (TREE_CODE (t))
......@@ -1430,7 +1436,12 @@ warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
case SSA_NAME:
/* We only do data flow with SSA_NAMEs, so that's all we
can warn about. */
warn_uninit (t, "%H%qD is used uninitialized in this function", data);
if (data->always_executed)
warn_uninit (t, "%H%qD is used uninitialized in this function",
data->stmt);
else
warn_uninit (t, "%H%qD may be used uninitialized in this function",
data->stmt);
*walk_subtrees = 0;
break;
......@@ -1478,14 +1489,21 @@ execute_early_warn_uninitialized (void)
{
block_stmt_iterator bsi;
basic_block bb;
struct walk_data data;
calculate_dominance_info (CDI_POST_DOMINATORS);
FOR_EACH_BB (bb)
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
{
tree context = bsi_stmt (bsi);
walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
context, NULL);
}
{
data.always_executed = dominated_by_p (CDI_POST_DOMINATORS,
single_succ (ENTRY_BLOCK_PTR), bb);
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
{
data.stmt = bsi_stmt (bsi);
walk_tree (bsi_stmt_ptr (bsi), warn_uninitialized_var,
&data, NULL);
}
}
return 0;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment