From 6687b74039b24bf8e3bdd35c4f250d5e08e5d5a3 Mon Sep 17 00:00:00 2001
From: Eric Botcazou <ebotcazou@gcc.gnu.org>
Date: Sat, 3 Jul 2010 13:14:48 +0000
Subject: [PATCH] * gimplify.c (mostly_copy_tree_r): Deal with BIND_EXPR.

From-SVN: r161774
---
 gcc/ChangeLog                        |  6 +++++-
 gcc/gimplify.c                       | 11 ++++-------
 gcc/testsuite/ChangeLog              |  4 ++++
 gcc/testsuite/gnat.dg/cond_expr1.adb |  7 +++++++
 4 files changed, 20 insertions(+), 8 deletions(-)
 create mode 100644 gcc/testsuite/gnat.dg/cond_expr1.adb

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d2e3ba539a78..8ef121a9dcf6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,8 @@
-2010-07-02  Jan Hubicka  <jh@suse.cz>
+2010-07-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gimplify.c (mostly_copy_tree_r): Deal with BIND_EXPR.
+
+2010-07-03  Jan Hubicka  <jh@suse.cz>
 
 	* config/i386/i386.c (override_options): Revert accidental commit.
 
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index a9c93ac972d0..9eb8fa70d3e7 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -868,9 +868,9 @@ mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
   tree t = *tp;
   enum tree_code code = TREE_CODE (t);
 
-  /* Do not copy SAVE_EXPR or TARGET_EXPR nodes themselves, but copy
-     their subtrees if we can make sure to do it only once.  */
-  if (code == SAVE_EXPR || code == TARGET_EXPR)
+  /* Do not copy SAVE_EXPR, TARGET_EXPR or BIND_EXPR nodes themselves, but
+     copy their subtrees if we can make sure to do it only once.  */
+  if (code == SAVE_EXPR || code == TARGET_EXPR || code == BIND_EXPR)
     {
       if (data && !pointer_set_insert ((struct pointer_set_t *)data, t))
 	;
@@ -895,10 +895,7 @@ mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
 
   /* Leave the bulk of the work to copy_tree_r itself.  */
   else
-    {
-      gcc_assert (code != BIND_EXPR);
-      copy_tree_r (tp, walk_subtrees, NULL);
-    }
+    copy_tree_r (tp, walk_subtrees, NULL);
 
   return NULL_TREE;
 }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fb71e59a560c..d64f5054b31f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-07-03  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gnat.dg/cond_expr1.adb: New test.
+
 2010-07-03  Eric Botcazou  <ebotcazou@adacore.com>
 
 	* gnat.dg/modular3.adb: New test.
diff --git a/gcc/testsuite/gnat.dg/cond_expr1.adb b/gcc/testsuite/gnat.dg/cond_expr1.adb
new file mode 100644
index 000000000000..e1a87a36ab53
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/cond_expr1.adb
@@ -0,0 +1,7 @@
+-- { dg-do compile }
+-- { dg-options "-gnat12" }
+
+function Cond_Expr1 (Dir : in String) return String is
+begin
+   return (if Dir (Dir'Last) = '\' then Dir else Dir & '\');
+end;
-- 
GitLab