diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2009-04-18 09:24:45 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2009-04-18 09:24:45 +0000 |
commit | 92ef7fb19a5111b98e86eb7c59d1a1d759ac1ec2 (patch) | |
tree | eac4cee15a78ad544b9a96b83862fb6e75037cb9 /gcc/testsuite | |
parent | 0e097268ba02d44bba29eb8e3955cde6e9bd5c7f (diff) | |
download | gcc-92ef7fb19a5111b98e86eb7c59d1a1d759ac1ec2.zip gcc-92ef7fb19a5111b98e86eb7c59d1a1d759ac1ec2.tar.gz gcc-92ef7fb19a5111b98e86eb7c59d1a1d759ac1ec2.tar.bz2 |
re PR middle-end/36902 (Array bound warning with dead code after optimization)
2009-04-18 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR middle-end/36902
* tree-vrp.c (check_array_ref): Pass a location_t instead of a
pointer. Use warning_at instead of warning.
(search_for_addr_array): Likewise.
(check_array_bounds): Likewise.
(check_all_array_refs): Check that the incoming edge is not in the
list of edges to be removed.
(check_all_array_refs): Avoid the temporal pointer.
(vrp_visit_cond_stmt): Fix typo.
(simplify_switch_using_ranges): Handle the case where the switch
index is an integer constant.
testsuite/
* gcc.dg/pr36902.c: New.
From-SVN: r146305
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr36902.c | 61 |
2 files changed, 66 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c4269123..a2449e8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-04-18 Manuel López-Ibáñez <manu@gcc.gnu.org> + + PR middle-end/36902 + * gcc.dg/pr36902.c: New. + 2009-04-17 Diego Novillo <dnovillo@google.com> * gcc.c-torture/execute/builtins/strlen-3.c: Fix ODR diff --git a/gcc/testsuite/gcc.dg/pr36902.c b/gcc/testsuite/gcc.dg/pr36902.c new file mode 100644 index 0000000..43a2d14 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr36902.c @@ -0,0 +1,61 @@ +/* PR middle-end/36902 Array bound warning with dead code after optimization */ +/* { dg-do compile } */ +/* { dg-options "-O2 -Warray-bounds -Wall -Wextra" } */ +typedef unsigned char __u8; +typedef unsigned short __u16; + +static inline unsigned char * +foo(unsigned char * to, const unsigned char * from, int n) +{ + switch ( n ) + { + case 3: + *to = *from; + break; + case 5: + to[4] = from [4]; + break; + } + return to; +} + +struct { + int size_of_select; + unsigned char pcr_select[4]; +} sel; + +int bar(void) +{ + static unsigned char buf[64]; + + sel.size_of_select = 3; + foo(buf, sel.pcr_select, sel.size_of_select); + + return 1; +} + + +static inline unsigned char * +foo2(unsigned char * to, const unsigned char * from, int n) +{ + switch ( n ) + { + case 3: + *to = *from; + break; + case 5: + to[4] = from [4]; /* { dg-warning "array subscript is above array bounds" } */ + break; + } + return to; +} + +int baz(void) +{ + static unsigned char buf[64]; + + sel.size_of_select = 5; + foo2(buf, sel.pcr_select, sel.size_of_select); + + return 1; +} |