diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-04 12:06:17 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-07-04 12:06:17 +0000 |
commit | bd9ba7ad5750848b2872e1761e396c73a60a94c2 (patch) | |
tree | d8d848361db6b3296dd9c34a27afc087fb8ba008 | |
parent | 934ca5fdf022cfa63de20487cdee1e57152b4e58 (diff) | |
download | gcc-bd9ba7ad5750848b2872e1761e396c73a60a94c2.tar.gz |
2011-07-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49615
* tree-cfgcleanup.c (split_bbs_on_noreturn_calls): Fix
basic-block index check.
* g++.dg/torture/pr49615.C: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@175803 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr49615.C | 29 | ||||
-rw-r--r-- | gcc/tree-cfgcleanup.c | 2 |
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8c0dc9ac79c..2ef91ce3047 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-07-04 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/49615 + * tree-cfgcleanup.c (split_bbs_on_noreturn_calls): Fix + basic-block index check. + 2011-07-04 Georg-Johann Lay <avr@gjlay.de> * longlong.h (count_leading_zeros, count_trailing_zeros, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 326ba5f8770..70806e1acfa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-04 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/49615 + * g++.dg/torture/pr49615.C: New testcase. + 2011-07-03 Ira Rosen <ira.rosen@linaro.org> PR tree-optimization/49610 diff --git a/gcc/testsuite/g++.dg/torture/pr49615.C b/gcc/testsuite/g++.dg/torture/pr49615.C new file mode 100644 index 00000000000..98a2f95b8b3 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr49615.C @@ -0,0 +1,29 @@ +/* { dg-do compile } */ +/* { dg-options "-g" } */ + +template <class T> +static inline bool Dispatch (T* obj, void (T::*func) ()) +{ + (obj->*func) (); +} +class C +{ + bool f (int); + void g (); +}; +bool C::f (int n) +{ + bool b; + switch (n) + { + case 0: + b = Dispatch (this, &C::g); + case 1: + b = Dispatch (this, &C::g); + } +} +void C::g () +{ + for (;;) { } +} + diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 1036e1e98f3..0c8c0852024 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -599,7 +599,7 @@ split_bbs_on_noreturn_calls (void) BB is present in the cfg. */ if (bb == NULL || bb->index < NUM_FIXED_BLOCKS - || bb->index >= n_basic_blocks + || bb->index >= last_basic_block || BASIC_BLOCK (bb->index) != bb || !gimple_call_noreturn_p (stmt)) continue; |