diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6e11ba3e4c06..3130001c9638 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-03-09 Andrew Pinski + + PR tree-opt/30045 + * tree-vrp.c (nonnull_arg_p): Treat the static decl as always + non null. + 2007-03-09 Andrew Pinski PR middle-end/30729 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f1d02915c255..984d1269e369 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-09 Andrew Pinski + + PR tree-opt/30045 + * gcc.dg/pr30045.c: New test. + 2007-03-09 Andrew Pinski PR middle-end/30729 diff --git a/gcc/testsuite/gcc.dg/pr30045.c b/gcc/testsuite/gcc.dg/pr30045.c new file mode 100644 index 000000000000..6dd22a1df7ab --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr30045.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-inline" } */ +int f(int *a) +{ + int __attribute__((nonnull(1))) g(int *b) + { + int **c = &a; + if (b) + return *a + **c; + return *b; + } + if (a) + return g(a); + return 1; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 2f0acdd51c4a..a051629ca1e2 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -102,6 +102,10 @@ nonnull_arg_p (tree arg) gcc_assert (TREE_CODE (arg) == PARM_DECL && POINTER_TYPE_P (TREE_TYPE (arg))); + /* The static chain decl is always non null. */ + if (arg == cfun->static_chain_decl) + return true; + fntype = TREE_TYPE (current_function_decl); attrs = lookup_attribute ("nonnull", TYPE_ATTRIBUTES (fntype));