PR c++/7209
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Oct 2002 08:56:49 +0000 (08:56 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Oct 2002 08:56:49 +0000 (08:56 +0000)
* fold_const.c (fold_binary_op_with_conditional_arg): Always
build compound_expr if we used save_expr.
testsuite:
* g++.dg/expr/cond1.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58405 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/expr/cond1.C [new file with mode: 0644]

index c1656be..2d85ff9 100644 (file)
@@ -1,3 +1,9 @@
+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.
index 6da2d91..5f5e25f 100644 (file)
@@ -4430,6 +4430,7 @@ fold_binary_op_with_conditional_arg (code, type, cond, arg, cond_first_p)
   /* And these are the types of the expressions.  */
   tree lhs_type = type;
   tree rhs_type = type;
+  int save = 0;
 
   if (cond_first_p)
     {
@@ -4488,11 +4489,12 @@ fold_binary_op_with_conditional_arg (code, type, cond, arg, 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));
@@ -4502,7 +4504,11 @@ fold_binary_op_with_conditional_arg (code, type, cond, arg, cond_first_p)
 
       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)
@@ -4512,7 +4518,7 @@ fold_binary_op_with_conditional_arg (code, type, cond, arg, cond_first_p)
 
   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));
index 314b222..78e7417 100644 (file)
@@ -1,3 +1,7 @@
+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.
diff --git a/gcc/testsuite/g++.dg/expr/cond1.C b/gcc/testsuite/g++.dg/expr/cond1.C
new file mode 100644 (file)
index 0000000..8fb3c0f
--- /dev/null
@@ -0,0 +1,28 @@
+// { 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;
+}