re PR middle-end/179 (-Wuninitialized missing warning with &var)
2008-08-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org> PR middle-end/179 * tree-ssa.c (warn_uninit): Do not warn for variables that can be initialized outside the current module. (warn_uninitialized_var): Ignore left-hand side when walking the trees. Ignore address expressions. Examine VUSE operands in gimple statements with a variable declaration on the right-hand side. testsuite/ * gcc.dg/uninit-6.c (make_something): Remove XFAIL. * gcc.dg/uninit-6-O0.c (make_something): Remove XFAIL. * gcc.dg/uninit-B.c (baz): Remove XFAIL. * gcc.dg/uninit-B-2.c: New. * gcc.dg/uninit-B-O0-2.c: New. * gcc.dg/uninit-pr19430-O0.c: New. * gcc.dg/uninit-pr19430.c: New. * gcc.dg/uninit-pr19430-2.c: New. From-SVN: r139347
This commit is contained in:
parent
7735154d75
commit
87fe2bd0e0
11 changed files with 202 additions and 3 deletions
|
@ -1,3 +1,12 @@
|
|||
2008-08-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
PR middle-end/179
|
||||
* tree-ssa.c (warn_uninit): Do not warn for variables that can be
|
||||
initialized outside the current module.
|
||||
(warn_uninitialized_var): Ignore left-hand side when walking the
|
||||
trees. Ignore address expressions. Examine VUSE operands in gimple
|
||||
statements with a variable declaration on the right-hand side.
|
||||
|
||||
2008-08-20 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
PR bootstrap/37155
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
2008-08-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
PR middle-end/179
|
||||
* gcc.dg/uninit-6.c (make_something): Remove XFAIL.
|
||||
* gcc.dg/uninit-6-O0.c (make_something): Remove XFAIL.
|
||||
* gcc.dg/uninit-B.c (baz): Remove XFAIL.
|
||||
* gcc.dg/uninit-B-2.c: New.
|
||||
* gcc.dg/uninit-B-O0-2.c: New.
|
||||
* gcc.dg/uninit-pr19430-O0.c: New.
|
||||
* gcc.dg/uninit-pr19430.c: New.
|
||||
* gcc.dg/uninit-pr19430-2.c: New.
|
||||
|
||||
2008-08-20 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
PR c++/35158
|
||||
|
|
|
@ -39,7 +39,7 @@ make_something(int a, int b, int c)
|
|||
rv = malloc (sizeof (struct tree));
|
||||
rv->car = 0;
|
||||
|
||||
APPEND(rv, field, INTEGER_T, a); /* { dg-bogus "field" "uninitialized variable warning" { xfail *-*-* } } */
|
||||
APPEND(rv, field, INTEGER_T, a); /* { dg-bogus "field" "uninitialized variable warning" } */
|
||||
APPEND(rv, field, PTR_T, b);
|
||||
APPEND(rv, field, INTEGER_T, c);
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ make_something(int a, int b, int c)
|
|||
rv = malloc (sizeof (struct tree));
|
||||
rv->car = 0;
|
||||
|
||||
APPEND(rv, field, INTEGER_T, a); /* { dg-bogus "field" "uninitialized variable warning" { xfail *-*-* } } */
|
||||
APPEND(rv, field, INTEGER_T, a); /* { dg-bogus "field" "uninitialized variable warning" } */
|
||||
APPEND(rv, field, PTR_T, b);
|
||||
APPEND(rv, field, INTEGER_T, c);
|
||||
|
||||
|
|
16
gcc/testsuite/gcc.dg/uninit-B-2.c
Normal file
16
gcc/testsuite/gcc.dg/uninit-B-2.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* Origin: PR c/179 inverse of uninit-B-O0.c, we should not warn. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Wuninitialized" } */
|
||||
extern void foo (int *);
|
||||
extern void bar (int);
|
||||
|
||||
void
|
||||
baz (void)
|
||||
{
|
||||
int i;
|
||||
foo (&i); /* { dg-bogus "is used uninitialized" "uninit i warning" } */
|
||||
if (i)
|
||||
bar (i);
|
||||
}
|
||||
|
||||
|
16
gcc/testsuite/gcc.dg/uninit-B-O0-2.c
Normal file
16
gcc/testsuite/gcc.dg/uninit-B-O0-2.c
Normal file
|
@ -0,0 +1,16 @@
|
|||
/* Origin: PR c/179 inverse of uninit-B-O0.c, we should not warn. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O0 -Wuninitialized" } */
|
||||
extern void foo (int *);
|
||||
extern void bar (int);
|
||||
|
||||
void
|
||||
baz (void)
|
||||
{
|
||||
int i;
|
||||
foo (&i); /* { dg-bogus "is used uninitialized" "uninit i warning" } */
|
||||
if (i)
|
||||
bar (i);
|
||||
}
|
||||
|
||||
|
|
@ -9,7 +9,7 @@ void
|
|||
baz (void)
|
||||
{
|
||||
int i;
|
||||
if (i) /* { dg-warning "uninit" "uninit i warning" { xfail *-*-* } } */
|
||||
if (i) /* { dg-warning "is used uninitialized" "uninit i warning" } */
|
||||
bar (i);
|
||||
foo (&i);
|
||||
}
|
||||
|
|
18
gcc/testsuite/gcc.dg/uninit-pr19430-2.c
Normal file
18
gcc/testsuite/gcc.dg/uninit-pr19430-2.c
Normal file
|
@ -0,0 +1,18 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -Wuninitialized" } */
|
||||
|
||||
int *p, *q;
|
||||
|
||||
int foo (int b)
|
||||
{
|
||||
int i, j = 0;
|
||||
int *x;
|
||||
p = &i;
|
||||
q = &j;
|
||||
if (b)
|
||||
x = p;
|
||||
else
|
||||
x = q;
|
||||
return *x;
|
||||
}
|
||||
|
43
gcc/testsuite/gcc.dg/uninit-pr19430-O0.c
Normal file
43
gcc/testsuite/gcc.dg/uninit-pr19430-O0.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O0 -Wuninitialized" } */
|
||||
extern int bar (int);
|
||||
extern void baz (int *);
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
int j; /* { dg-warning "'j' may be used uninitialized in this function" "uninitialized" { xfail *-*-* } 9 } */
|
||||
|
||||
if (bar (i)) {
|
||||
baz (&j);
|
||||
} else {
|
||||
}
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
int foo2( void ) {
|
||||
int rc; /* { dg-warning "'rc' is used uninitialized in this function" "uninitialized" { xfail *-*-* } 21 } */
|
||||
return rc;
|
||||
*&rc = 0;
|
||||
}
|
||||
|
||||
extern int printf(const char *, ...);
|
||||
void frob(int *pi);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i;
|
||||
printf("i = %d\n", i); /* { dg-warning "'i' is used uninitialized in this function" "uninitialized" { xfail *-*-* } 32 } */
|
||||
frob(&i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void foo3(int*);
|
||||
void bar3(void) {
|
||||
int x;
|
||||
if(x) /* { dg-warning "'x' is used uninitialized in this function" "uninitialized" { xfail *-*-* } 41 } */
|
||||
foo3(&x);
|
||||
}
|
43
gcc/testsuite/gcc.dg/uninit-pr19430.c
Normal file
43
gcc/testsuite/gcc.dg/uninit-pr19430.c
Normal file
|
@ -0,0 +1,43 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -Wuninitialized" } */
|
||||
extern int bar (int);
|
||||
extern void baz (int *);
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
int j; /* { dg-warning "'j' may be used uninitialized in this function" "uninitialized" { xfail *-*-* } 8 } */
|
||||
|
||||
if (bar (i)) {
|
||||
baz (&j);
|
||||
} else {
|
||||
}
|
||||
|
||||
return j;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int foo2( void ) {
|
||||
int rc; /* { dg-warning "'rc' is used uninitialized in this function" } */
|
||||
return rc;
|
||||
*&rc = 0;
|
||||
}
|
||||
|
||||
extern int printf(const char *, ...);
|
||||
void frob(int *pi);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int i;
|
||||
printf("i = %d\n", i); /* { dg-warning "'i' is used uninitialized in this function" } */
|
||||
frob(&i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void foo3(int*);
|
||||
void bar3(void) {
|
||||
int x;
|
||||
if(x) /* { dg-warning "'x' is used uninitialized in this function" "uninitialized" } */
|
||||
foo3(&x);
|
||||
}
|
|
@ -1411,6 +1411,10 @@ warn_uninit (tree t, const char *gmsgid, void *data)
|
|||
if (TREE_NO_WARNING (var))
|
||||
return;
|
||||
|
||||
/* Do not warn if it can be initialized outside this module. */
|
||||
if (is_global_var (var))
|
||||
return;
|
||||
|
||||
location = (context != NULL && gimple_has_location (context))
|
||||
? gimple_location (context)
|
||||
: DECL_SOURCE_LOCATION (var);
|
||||
|
@ -1443,8 +1447,46 @@ warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data_)
|
|||
struct walk_data *data = (struct walk_data *) wi->info;
|
||||
tree t = *tp;
|
||||
|
||||
/* We do not care about LHS. */
|
||||
if (wi->is_lhs)
|
||||
return NULL_TREE;
|
||||
|
||||
switch (TREE_CODE (t))
|
||||
{
|
||||
case ADDR_EXPR:
|
||||
/* Taking the address of an uninitialized variable does not
|
||||
count as using it. */
|
||||
*walk_subtrees = 0;
|
||||
break;
|
||||
|
||||
case VAR_DECL:
|
||||
{
|
||||
/* A VAR_DECL in the RHS of a gimple statement may mean that
|
||||
this variable is loaded from memory. */
|
||||
use_operand_p vuse;
|
||||
tree op;
|
||||
|
||||
/* If there is not gimple stmt,
|
||||
or alias information has not been computed,
|
||||
then we cannot check VUSE ops. */
|
||||
if (data->stmt == NULL
|
||||
|| !gimple_aliases_computed_p (cfun))
|
||||
return NULL_TREE;
|
||||
|
||||
vuse = SINGLE_SSA_USE_OPERAND (data->stmt, SSA_OP_VUSE);
|
||||
if (vuse == NULL_USE_OPERAND_P)
|
||||
return NULL_TREE;
|
||||
|
||||
op = USE_FROM_PTR (vuse);
|
||||
if (t != SSA_NAME_VAR (op)
|
||||
|| !SSA_NAME_IS_DEFAULT_DEF (op))
|
||||
return NULL_TREE;
|
||||
/* If this is a VUSE of t and it is the default definition,
|
||||
then warn about op. */
|
||||
t = op;
|
||||
/* Fall through into SSA_NAME. */
|
||||
}
|
||||
|
||||
case SSA_NAME:
|
||||
/* We only do data flow with SSA_NAMEs, so that's all we
|
||||
can warn about. */
|
||||
|
|
Loading…
Add table
Reference in a new issue