From 8015455a87e3e516d3238fb3231ab50214234289 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Tue, 21 Aug 2007 08:23:50 +0000 Subject: [PATCH] re PR middle-end/33122 (Mistaken type mismatch error prevents bootstrap) 2007-08-21 Richard Guenther PR middle-end/33122 * fold-const.c (fold_binary): Remove index +p PTR folding. Fix types of POINTER_PLUS_EXPR generated by folding of (PTR +p B) +p A. * gcc.c-torture/compile/pr33122.c: New testcase. From-SVN: r127659 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 14 ++++++-------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr33122.c | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr33122.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 39535283140..8223bdd3797 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-08-21 Richard Guenther + + PR middle-end/33122 + * fold-const.c (fold_binary): Remove index +p PTR folding. + Fix types of POINTER_PLUS_EXPR generated by folding of + (PTR +p B) +p A. + 2007-08-20 Chao-ying Fu * c-common.h (enum rid): Add new enumeration values of RID_SAT, diff --git a/gcc/fold-const.c b/gcc/fold-const.c index d5d0f1e3c11..8faf77d8751 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9528,20 +9528,17 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) fold_convert (sizetype, arg1), fold_convert (sizetype, arg0))); - /* index +p PTR -> PTR +p index */ - if (POINTER_TYPE_P (TREE_TYPE (arg1)) - && INTEGRAL_TYPE_P (TREE_TYPE (arg0))) - return fold_build2 (POINTER_PLUS_EXPR, type, - fold_convert (type, arg1), fold_convert (sizetype, arg0)); - /* (PTR +p B) +p A -> PTR +p (B + A) */ if (TREE_CODE (arg0) == POINTER_PLUS_EXPR) { tree inner; tree arg01 = fold_convert (sizetype, TREE_OPERAND (arg0, 1)); tree arg00 = TREE_OPERAND (arg0, 0); - inner = fold_build2 (PLUS_EXPR, sizetype, arg01, fold_convert (sizetype, arg1)); - return fold_build2 (POINTER_PLUS_EXPR, type, arg00, inner); + inner = fold_build2 (PLUS_EXPR, sizetype, + arg01, fold_convert (sizetype, arg1)); + return fold_convert (type, + fold_build2 (POINTER_PLUS_EXPR, + TREE_TYPE (arg00), arg00, inner)); } /* PTR_CST +p CST -> CST1 */ @@ -9559,6 +9556,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) } return NULL_TREE; + case PLUS_EXPR: /* PTR + INT -> (INT)(PTR p+ INT) */ if (POINTER_TYPE_P (TREE_TYPE (arg0)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c94e48ba283..29500ed8fdf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-21 Richard Guenther + + PR middle-end/33122 + * gcc.c-torture/compile/pr33122.c: New testcase. + 2007-03-20 Pawel Sikora * g++.dg/warn/Wnvdtor-2.C: New testcase. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr33122.c b/gcc/testsuite/gcc.c-torture/compile/pr33122.c new file mode 100644 index 00000000000..e86254030a6 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr33122.c @@ -0,0 +1,14 @@ +struct dis386 { + const char *x; +}; + +static const struct dis386 float_reg[][2] = { + { { "fadd" }, { "fadd" } }, +}; + +void foo(int i, int j) +{ + const struct dis386 *dp; + + dp = &float_reg[i - 1][j]; +}