re PR c++/63904 (ICE when accessing array member of constexpr struct)
authorKai Tietz <ktietz@redhat.com>
Thu, 27 Nov 2014 13:02:45 +0000 (14:02 +0100)
committerKai Tietz <ktietz@gcc.gnu.org>
Thu, 27 Nov 2014 13:02:45 +0000 (14:02 +0100)
2014-11-27  Kai Tietz  <ktietz@redhat.com>

PR c++/63904
* constexpr.c (cxx_eval_vec_init_1): Avoid
type-overflow issue.

From-SVN: r218123

gcc/cp/ChangeLog
gcc/cp/constexpr.c

index 9c6427963e77c9db850ee41c4e8fa32504d4ab00..a59182bdeb42dab5fb2e58ceb3396940dbf601fa 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-27  Kai Tietz  <ktietz@redhat.com>
+
+       PR c++/63904
+       * constexpr.c (cxx_eval_vec_init_1): Avoid
+       type-overflow issue.
+
 2014-11-26  Jason Merrill  <jason@redhat.com>
 
        Allow partial specialization of variable templates.
index ef9ef70d6e0b303e0196a20ebbb4c3eda311f3eb..f4aca4b9408d29615aa4a97e3bbb5f3a0dd4ac22 100644 (file)
@@ -2013,12 +2013,12 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
                     bool *non_constant_p, bool *overflow_p)
 {
   tree elttype = TREE_TYPE (atype);
-  int max = tree_to_shwi (array_type_nelts (atype));
+  unsigned HOST_WIDE_INT max = tree_to_uhwi (array_type_nelts_top (atype));
   verify_ctor_sanity (ctx, atype);
   vec<constructor_elt, va_gc> **p = &CONSTRUCTOR_ELTS (ctx->ctor);
   vec_alloc (*p, max + 1);
   bool pre_init = false;
-  int i;
+  unsigned HOST_WIDE_INT i;
 
   /* For the default constructor, build up a call to the default
      constructor of the element type.  We only need to handle class types
@@ -2043,7 +2043,7 @@ cxx_eval_vec_init_1 (const constexpr_ctx *ctx, tree atype, tree init,
       pre_init = true;
     }
 
-  for (i = 0; i <= max; ++i)
+  for (i = 0; i < max; ++i)
     {
       tree idx = build_int_cst (size_type_node, i);
       tree eltinit;