https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86532

--- Comment #7 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
Maybe something like the following?

--- expr.c.kk   2018-07-17 10:14:43.668347058 +0200
+++ expr.c      2018-07-17 10:21:13.101779984 +0200
@@ -11282,6 +11282,7 @@ string_constant (tree arg, tree *ptr_off
   /* Non-constant index into the character array in an ARRAY_REF
      expression or null.  */
   tree varidx = NULL_TREE;
+  tree varsize = NULL_TREE;

   poly_int64 base_off = 0;

@@ -11289,6 +11290,7 @@ string_constant (tree arg, tree *ptr_off
     {
       arg = TREE_OPERAND (arg, 0);
       tree ref = arg;
+      varsize = TYPE_SIZE_UNIT (TREE_TYPE (ref));
       if (TREE_CODE (arg) == ARRAY_REF)
        {
          tree idx = TREE_OPERAND (arg, 1);
@@ -11369,7 +11371,7 @@ string_constant (tree arg, tree *ptr_off
   /* Handle variables initialized with string literals.  */
   if (!init || init == error_mark_node)
     return NULL_TREE;
-  if (TREE_CODE (init) == CONSTRUCTOR)
+  if (TREE_CODE (init) == CONSTRUCTOR && !varidx)
     {
       if (TREE_CODE (arg) != ARRAY_REF
          && TREE_CODE (arg) == COMPONENT_REF
@@ -11401,8 +11403,7 @@ string_constant (tree arg, tree *ptr_off
   if (!init || TREE_CODE (init) != STRING_CST)
     return NULL_TREE;

-  tree array_size = DECL_SIZE_UNIT (array);
-  if (!array_size || TREE_CODE (array_size) != INTEGER_CST)
+  if (!varsize || TREE_CODE (varsize) != INTEGER_CST)
     return NULL_TREE;

   /* Avoid returning a string that doesn't fit in the array
@@ -11415,7 +11416,7 @@ string_constant (tree arg, tree *ptr_off
      but not to strlen().  */
   unsigned HOST_WIDE_INT length
     = strnlen (TREE_STRING_POINTER (init), TREE_STRING_LENGTH (init));
-  if (compare_tree_int (array_size, length + 1) < 0)
+  if (compare_tree_int (varsize, length + 1) < 0)
     return NULL_TREE;

   *ptr_offset = offset;

Reply via email to