Update gcc-50 to SVN version 221572
[dragonfly.git] / contrib / gcc-5.0 / gcc / cp / constexpr.c
index 1b5f50c..37b619d 100644 (file)
@@ -2427,6 +2427,27 @@ cxx_fold_indirect_ref (location_t loc, tree type, tree op0, bool *empty_base)
                    break;
                  }
            }
+         /* *(&A[i] p+ j) => A[i + j] */
+         else if (TREE_CODE (op00) == ARRAY_REF
+                  && TREE_CODE (TREE_OPERAND (op00, 1)) == INTEGER_CST
+                  && TREE_CODE (op01) == INTEGER_CST)
+           {
+             tree t = fold_convert_loc (loc, ssizetype,
+                                        TREE_OPERAND (op00, 1));
+             tree nelts
+               = array_type_nelts_top (TREE_TYPE (TREE_OPERAND (op00, 0)));
+             /* Don't fold an out-of-bound access.  */
+             if (!tree_int_cst_le (t, nelts))
+               return NULL_TREE;
+             /* Make sure to treat the second operand of POINTER_PLUS_EXPR
+                as signed.  */
+             op01 = fold_build2_loc (loc, EXACT_DIV_EXPR, ssizetype,
+                                     cp_fold_convert (ssizetype, op01),
+                                     TYPE_SIZE_UNIT (type));
+             t = size_binop_loc (loc, PLUS_EXPR, op01, t);
+             return build4_loc (loc, ARRAY_REF, type, TREE_OPERAND (op00, 0),
+                                t, NULL_TREE, NULL_TREE);
+           }
        }
     }
   /* *(foo *)fooarrptr => (*fooarrptr)[0] */