+2002-10-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/7209
+ * fold_const.c (fold_binary_op_with_conditional_arg): Always
+ build compound_expr if we used save_expr.
+
2002-10-22 Alan Modra <amodra@bigpond.net.au>
* output.h (SECTION_NOTYPE): Define.
/* And these are the types of the expressions. */
tree lhs_type = type;
tree rhs_type = type;
+ int save = 0;
if (cond_first_p)
{
if an arm is a COND_EXPR since we get exponential behavior
in that case. */
- if (TREE_CODE (arg) != SAVE_EXPR && ! TREE_CONSTANT (arg)
- && (*lang_hooks.decls.global_bindings_p) () == 0
- && ((TREE_CODE (arg) != VAR_DECL
- && TREE_CODE (arg) != PARM_DECL)
- || TREE_SIDE_EFFECTS (arg)))
+ if (TREE_CODE (arg) == SAVE_EXPR)
+ save = 1;
+ else if (!TREE_CONSTANT (arg)
+ && (*lang_hooks.decls.global_bindings_p) () == 0
+ && ((TREE_CODE (arg) != VAR_DECL && TREE_CODE (arg) != PARM_DECL)
+ || TREE_SIDE_EFFECTS (arg)))
{
if (TREE_CODE (true_value) != COND_EXPR)
lhs = fold (build (lhs_code, lhs_type, *true_lhs, *true_rhs));
if ((lhs == 0 || ! TREE_CONSTANT (lhs))
&& (rhs == 0 || !TREE_CONSTANT (rhs)))
- arg = save_expr (arg), lhs = rhs = 0;
+ {
+ arg = save_expr (arg);
+ lhs = rhs = 0;
+ save = 1;
+ }
}
if (lhs == 0)
test = fold (build (COND_EXPR, type, test, lhs, rhs));
- if (TREE_CODE (arg) == SAVE_EXPR)
+ if (save)
return build (COMPOUND_EXPR, type,
convert (void_type_node, arg),
strip_compound_expr (test, arg));
+2002-10-22 Nathan Sidwell <nathan@codesourcery.com>
+
+ * g++.dg/expr/cond1.C: New test.
+
2002-10-21 Mark Mitchell <mark@codesourcery.com>
* g++.dg/abi/vbase13.C: New test.
--- /dev/null
+// { dg-do run }
+
+// Copyright (C) 2001 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 17 Oct 2002 <nathan@codesourcery.com>
+
+// PR 7209. We didn't SAVE_EXPR in the right place
+
+char a[2][1][16]={
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}};
+
+int f() {return 0;}
+
+char * Foo (int d)
+{
+ char *c1;
+
+ c1=a[d==0 ? 0 : 1][f()];
+
+ return c1;
+}
+
+int main ()
+{
+ if (Foo (0) != (void *)a)
+ return 1;
+ return 0;
+}