re PR c++/82294 (Array of objects with constexpr constructors initialized from space...
authorJakub Jelinek <jakub@redhat.com>
Fri, 14 Dec 2018 19:36:33 +0000 (20:36 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 14 Dec 2018 19:36:33 +0000 (20:36 +0100)
PR c++/82294
PR c++/87436
* init.c (build_vec_init): Change num_initialized_elts type from int
to HOST_WIDE_INT.  Build a RANGE_EXPR if e needs to be repeated more
than once.

From-SVN: r267142

gcc/cp/ChangeLog
gcc/cp/init.c

index 46557bec5c22381b9fd5c32e2554f6a99899cb4f..6460a666e985b1c2955854e2ef76935410413ffa 100644 (file)
@@ -1,3 +1,11 @@
+2018-12-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/82294
+       PR c++/87436
+       * init.c (build_vec_init): Change num_initialized_elts type from int
+       to HOST_WIDE_INT.  Build a RANGE_EXPR if e needs to be repeated more
+       than once.
+
 2018-12-13  Marek Polacek  <polacek@redhat.com>
 
        PR c++/88216 - ICE with class type in non-type template parameter.
index 5a314862c805e353cce74e1c3036626478f9401f..54a1dae488568adbbfb3bfaad97205e3469ef229 100644 (file)
@@ -4104,7 +4104,7 @@ build_vec_init (tree base, tree maxindex, tree init,
   tree compound_stmt;
   int destroy_temps;
   tree try_block = NULL_TREE;
-  int num_initialized_elts = 0;
+  HOST_WIDE_INT num_initialized_elts = 0;
   bool is_global;
   tree obase = base;
   bool xvalue = false;
@@ -4539,10 +4539,13 @@ build_vec_init (tree base, tree maxindex, tree init,
 
          if (e)
            {
-             int max = tree_to_shwi (maxindex)+1;
-             for (; num_initialized_elts < max; ++num_initialized_elts)
+             HOST_WIDE_INT last = tree_to_shwi (maxindex);
+             if (num_initialized_elts <= last)
                {
                  tree field = size_int (num_initialized_elts);
+                 if (num_initialized_elts != last)
+                   field = build2 (RANGE_EXPR, sizetype, field,
+                                   size_int (last));
                  CONSTRUCTOR_APPEND_ELT (const_vec, field, e);
                }
            }