From de556b3259a3e20a3bba1b8b3d73336e39754e68 Mon Sep 17 00:00:00 2001
From: amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 7 Dec 2006 14:39:37 +0000
Subject: [PATCH] 2006-12-07  Andrew Macleod  <amacleod@redhat.com>

	* expr.c (string_constant): Account for non-zero lower bound arrays.



git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119623 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog |  4 ++++
 gcc/expr.c    | 16 +++++++++++++++-
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0926c1dc5505..3c98eb1ffe90 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2006-12-07  Andrew Macleod  <amacleod@redhat.com>
+
+	* expr.c (string_constant): Account for non-zero lower bound arrays.
+
 2006-12-07  Richard Guenther  <rguenther@suse.de>
 
 	* builtins.c (expand_builtin_pow): Adjust predicates for
diff --git a/gcc/expr.c b/gcc/expr.c
index 05bb9b80f6c7..9c2d2a64771c 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8923,7 +8923,7 @@ is_aligning_offset (tree offset, tree exp)
 tree
 string_constant (tree arg, tree *ptr_offset)
 {
-  tree array, offset;
+  tree array, offset, lower_bound;
   STRIP_NOPS (arg);
 
   if (TREE_CODE (arg) == ADDR_EXPR)
@@ -8945,6 +8945,20 @@ string_constant (tree arg, tree *ptr_offset)
 	  if (TREE_CODE (array) != STRING_CST
 	      && TREE_CODE (array) != VAR_DECL)
 	    return 0;
+
+	  /* Check if the array has a non-zero lower bound.  */
+	  lower_bound = array_ref_low_bound (TREE_OPERAND (arg, 0));
+	  if (!integer_zerop (lower_bound))
+	    {
+	      /* If the offset and base aren't both constants, return 0.  */
+	      if (TREE_CODE (lower_bound) != INTEGER_CST)
+	        return 0;
+	      if (TREE_CODE (offset) != INTEGER_CST)
+		return 0;
+	      /* Adjust offset by the lower bound.  */
+	      offset = size_diffop (fold_convert (sizetype, offset), 
+				    fold_convert (sizetype, lower_bound));
+	    }
 	}
       else
 	return 0;
-- 
GitLab