Hi,

for this small 5/6 regression (an ICE) Markus suggests in the audit trail to protect the tree_to_shwi call with tree_fits_shwi_p. I tweaked a bit his suggestion adopting a pattern already used, eg, in the parser, and successfully tested it in trunk. I suppose it could make sense to also fix the issue in the branch, if we can do that safely, and I also propose below a variant for that (cxx_eval_array_reference is slightly different in the branch). Ok?

Thanks,
Paolo.

////////////////////////////
/cp
2015-11-25  Markus Trippelsdorf  <mar...@trippelsdorf.de>
            Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/68087
        * constexpr.c (cxx_eval_array_reference): Use tree_fits_shwi_p before
        tree_to_shwi to avoid ICEs.

/testsuite
2015-11-25  Markus Trippelsdorf  <mar...@trippelsdorf.de>
            Paolo Carlini  <paolo.carl...@oracle.com>

        PR c++/68087
        * g++.dg/cpp0x/constexpr-array13.C: New.
Index: cp/constexpr.c
===================================================================
--- cp/constexpr.c      (revision 230865)
+++ cp/constexpr.c      (working copy)
@@ -1799,8 +1799,8 @@ cxx_eval_array_reference (const constexpr_ctx *ctx
       gcc_unreachable ();
     }
 
-  i = tree_to_shwi (index);
-  if (i < 0)
+  if (!tree_fits_shwi_p (index)
+      || (i = tree_to_shwi (index)) < 0)
     {
       if (!ctx->quiet)
        error ("negative array subscript");
Index: testsuite/g++.dg/cpp0x/constexpr-array13.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-array13.C  (revision 0)
+++ testsuite/g++.dg/cpp0x/constexpr-array13.C  (working copy)
@@ -0,0 +1,6 @@
+// PR c++/68087
+// { dg-do compile { target c++11 } }
+
+constexpr char c[] = "hello";
+constexpr const char *p = c;
+constexpr char ch = *(p-1);  // { dg-error "negative array subscript" }
Index: cp/constexpr.c
===================================================================
--- cp/constexpr.c      (revision 230866)
+++ cp/constexpr.c      (working copy)
@@ -1751,7 +1751,7 @@ cxx_eval_array_reference (const constexpr_ctx *ctx
       gcc_unreachable ();
     }
 
-  i = tree_to_shwi (index);
+  i = tree_fits_shwi_p (index) ? tree_to_shwi (index) : -1;
   bool found = true;
   if (TREE_CODE (ary) == CONSTRUCTOR && len
       && (TREE_CODE (CONSTRUCTOR_ELT (ary, len-1)->index) == RANGE_EXPR
Index: testsuite/g++.dg/cpp0x/constexpr-array13.C
===================================================================
--- testsuite/g++.dg/cpp0x/constexpr-array13.C  (revision 0)
+++ testsuite/g++.dg/cpp0x/constexpr-array13.C  (working copy)
@@ -0,0 +1,6 @@
+// PR c++/68087
+// { dg-do compile { target c++11 } }
+
+constexpr char c[] = "hello";
+constexpr const char *p = c;
+constexpr char ch = *(p-1);  // { dg-error "negative array subscript" }

Reply via email to