PR c++/68308 - [6 Regression] ICE: tree check: expected integer_cst,
authorMartin Sebor <msebor@redhat.com>
Tue, 17 Nov 2015 18:09:36 +0000 (18:09 +0000)
committerMartin Sebor <msebor@gcc.gnu.org>
Tue, 17 Nov 2015 18:09:36 +0000 (11:09 -0700)
have var_decl in decompose, at tree.h:5105

gcc/
    * cp/init.c (build_new_1): Check for expression constness
    the right way.

testsuite/
    * g++.dg/init/new46.C: New test.

From-SVN: r230468

gcc/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/new46.C [new file with mode: 0644]

index b9bb07c07cea2b58e417282c33f173de9b7784ae..747dea3bc26534d56937ac233a0d0a8b8e6f52ea 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-17  Martin Sebor  <msebor@redhat.com>
+
+       PR c++/68308
+       * cp/init.c (build_new_1): Check for expression constness
+       the right way.
+
 2015-11-17  Sandra Loosemore  <sandra@codesourcery.com>
 
        PR target/56036
index fccd2896a87db3196db92352158cf15d867d39fb..5ecf9fb1cad492c64ec3a9e04fcde072340991f2 100644 (file)
@@ -2715,7 +2715,7 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
 
       size = size_binop (MULT_EXPR, size, fold_convert (sizetype, nelts));
 
-      if (TREE_CONSTANT (outer_nelts))
+      if (INTEGER_CST == TREE_CODE (outer_nelts))
        {
          if (tree_int_cst_lt (max_outer_nelts_tree, outer_nelts))
            {
@@ -3330,7 +3330,8 @@ build_new (vec<tree, va_gc> **placement, tree type, tree nelts,
         non-class type and its value before converting to std::size_t is
         less than zero. ... If the expression is a constant expression,
         the program is ill-fomed.  */
-      if (TREE_CONSTANT (cst_nelts) && tree_int_cst_sgn (cst_nelts) == -1)
+      if (INTEGER_CST == TREE_CODE (cst_nelts)
+         && tree_int_cst_sgn (cst_nelts) == -1)
        {
          if (complain & tf_error)
            error ("size of array is negative");
index 850758b45d6c7f2ccf940b4c06d02f09df2facab..69adb07627eb2d82e4851ab186050353f77f7f58 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-17  Martin Sebor  <msebor@redhat.com>
+
+       PR c++/68308
+       * g++.dg/init/new46.C: New test.
+
 2015-11-17  Dominique d'Humieres <dominiq@lps.ens.fr>
 
        PR fortran/65751
diff --git a/gcc/testsuite/g++.dg/init/new46.C b/gcc/testsuite/g++.dg/init/new46.C
new file mode 100644 (file)
index 0000000..9fd747e
--- /dev/null
@@ -0,0 +1,65 @@
+// { dg-do compile }
+// { dg-options "-Wall" }
+
+// Test for c++/68308 - [6 Regression] ICE: tree check: expected integer_cst,
+//                      have var_decl in decompose, at tree.h:5105
+
+typedef __typeof__ (sizeof 0) size_t;
+
+// Not defined, only referenced in templates that aren't expected
+// to be instantiated to make sure they really aren't to verify
+// verify c++/68308.
+template <class T> void inst_check ();
+
+// Not instantiated (must not be diagnosed).
+template <class T>
+char* fn1_x () {
+    const size_t a = sizeof (T);
+    return inst_check<T>() ? new char [a] : 0;
+}
+
+// Not instantiated (must not be diagnosed).
+template <size_t N>
+char* fn2_1_x () {
+    return inst_check<char [N]>() ? new char [N] : 0;
+}
+
+template <size_t N>
+char* fn2_1 () {
+    return new char [N];
+}
+
+// Not instantiated (must not be diagnosed).
+template <size_t M, size_t N>
+char* fn2_2_x () {
+    return inst_check<char [M][N]>() ? new char [M][N] : 0;
+}
+
+template <size_t M, size_t N>
+char* fn2_2 () {
+    return new char [M][N];   // { dg-error "size of array is too large" }
+}
+
+// Not instantiated (must not be diagnosed).
+template <class T>
+T* fn3_x () {
+    const size_t a = sizeof (T);
+    return inst_check<T>() ? new T [a] : 0;
+}
+
+template <class T>
+T* fn3 () {
+    const size_t a = sizeof (T);
+    return new T [a];         // { dg-error "size of array is too large" }
+}
+
+
+struct S { char a [__SIZE_MAX__ / 8]; };
+
+void foo ()
+{
+    fn2_1<1>();
+    fn2_1<__SIZE_MAX__ / 4>();
+    fn2_2<__SIZE_MAX__ / 4, 4>();
+    fn3<S>();
+}