From 5e9abf2ce4a4e1e380a1da8016eac24b22973dfd Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Wed, 5 Nov 2008 17:06:38 +0100 Subject: [PATCH] re PR middle-end/37861 (Bogus array bounds warning) 2008-11-05 Martin Jambor PR middle-end/37861 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't turn pointer arithmetics into array_ref if the array is accessed through an indirect_ref. * testsuite/gcc.dg/Warray-bounds-5.c: New file. * testsuite/gcc.dg/Warray-bounds-6.c: New file. From-SVN: r141613 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/Warray-bounds-5.c | 24 +++++++++++++++++++++ gcc/testsuite/gcc.dg/Warray-bounds-6.c | 29 ++++++++++++++++++++++++++ gcc/tree-ssa-forwprop.c | 3 +++ 5 files changed, 69 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/Warray-bounds-5.c create mode 100644 gcc/testsuite/gcc.dg/Warray-bounds-6.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4a6b0c20f90..551175064f1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-11-05 Martin Jambor + + PR middle-end/37861 + * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Don't turn + pointer arithmetics into array_ref if the array is accessed + through an indirect_ref. + 2008-11-05 Richard Guenther PR middle-end/37742 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1049f5f50a6..fa5e732f015 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-11-05 Martin Jambor + + PR middle-end/37861 + * gcc.dg/Warray-bounds-5.c: New test. + * gcc.dg/Warray-bounds-6.c: New test. + 2008-11-05 Fabien Chene PR c++/32519 diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-5.c b/gcc/testsuite/gcc.dg/Warray-bounds-5.c new file mode 100644 index 00000000000..ba9cd2aa03f --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-5.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -Wall" } */ +/* based on PR 37861 */ + +extern int printf (__const char *__restrict __format, ...); + +static int f2(char formatstr[10][100]) +{ + int anz; + for( anz = 0; anz < 10; ++anz ) { + printf( "%d %s\n", anz, formatstr[anz] ); + } + return anz; +} + + +static char formatstr[10][100]; +int main( void ) +{ + int anz; + anz = f2(formatstr); + printf( " %d\n",anz); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-6.c b/gcc/testsuite/gcc.dg/Warray-bounds-6.c new file mode 100644 index 00000000000..44a513bba4b --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-6.c @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -Wall" } */ +/* based on PR 37861 */ + +extern int printf (__const char *__restrict __format, ...); + +static int f3(int v) +{ + int i,j = 0; + for (i = 0; i <= v; i++) + j++; + return j; +} + +static int f2(char formatstr[10][100]) { + printf( "%d %s\n", 0, formatstr[f3(0)] ); + printf( "%d %s\n", 1, formatstr[f3(1)] ); + printf( "%d %s\n", 2, formatstr[f3(2)] ); + printf( "%d %s\n", 3, formatstr[f3(3)] ); + return 3; +} + +static char formatstr[10][100]; +int main( void ) { + int anz; + anz = f2(formatstr); + printf( " %d\n",anz); + return 0; +} diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index a04e7ca4404..5626b103429 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -802,6 +802,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs, array_ref = TREE_OPERAND (def_rhs, 0); if (TREE_CODE (array_ref) != ARRAY_REF || TREE_CODE (TREE_TYPE (TREE_OPERAND (array_ref, 0))) != ARRAY_TYPE + /* Avoid accessing hidden multidimensional arrays in this way or VRP + might give out bogus warnings (see PR 37861) */ + || TREE_CODE (TREE_OPERAND (array_ref, 0)) == INDIRECT_REF || !integer_zerop (TREE_OPERAND (array_ref, 1))) return false;