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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |jakub at gcc dot gnu.org

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So far I have:
--- gcc/cp/typeck2.c.jj 2017-03-02 08:08:42.000000000 +0100
+++ gcc/cp/typeck2.c    2017-03-31 15:36:54.366928789 +0200
@@ -739,7 +739,9 @@ split_nonconstant_init (tree dest, tree

   if (TREE_CODE (init) == TARGET_EXPR)
     init = TARGET_EXPR_INITIAL (init);
-  if (TREE_CODE (init) == CONSTRUCTOR)
+  if (TREE_CODE (init) == CONSTRUCTOR
+      || (TREE_CODE (init) == STRING_CST
+         && array_of_runtime_bound_p (TREE_TYPE (dest))))
     {
       init = cp_fully_fold (init);
       code = push_stmt_list ();
@@ -1066,7 +1068,7 @@ digest_init_r (tree type, tree init, boo
                }
            }

-         if (type != TREE_TYPE (init))
+         if (type != TREE_TYPE (init) && !array_of_runtime_bound_p (type))
            {
              init = copy_node (init);
              TREE_TYPE (init) = type;
--- gcc/cp/init.c.jj    2017-03-21 08:04:13.000000000 +0100
+++ gcc/cp/init.c       2017-03-31 16:38:18.346535659 +0200
@@ -4199,7 +4199,12 @@ build_vec_init (tree base, tree maxindex
   else if (from_array)
     {
       if (init)
-       /* OK, we set base2 above.  */;
+       {
+         /* OK, we set base2 above.  */
+         if (TREE_CODE (init) == STRING_CST
+             && array_of_runtime_bound_p (atype))
+           empty_list = true;
+       }
       else if (CLASS_TYPE_P (type)
               && ! TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
        {
and the remaining part is changing build_vec_init, so that it will perform the
memcpy (MEM_REF = STRING_CST) followed by the initialization of the rest.

Reply via email to