pt.c (tsubst): Check valid_array_size_p.
authorJason Merrill <jason@redhat.com>
Mon, 14 May 2018 14:49:45 +0000 (10:49 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 14 May 2018 14:49:45 +0000 (10:49 -0400)
* pt.c (tsubst) [ARRAY_TYPE]: Check valid_array_size_p.

(tsubst_copy_and_build) [NEW_EXPR]: Clear in_decl.

gcc/c-family/
* c-common.c (valid_array_size_p): Add complain parameter.
* c-common.h: ...which defaults to true.

From-SVN: r260227

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/init/new38.C
gcc/testsuite/g++.dg/template/array30.C [new file with mode: 0644]

index c38d5ecac898a0bf52e5308e2e5330f4c4ff7865..27bdd2ddb1d0ac36a6186d066b845f7bf53f63dd 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-09  Jason Merrill  <jason@redhat.com>
+
+       * c-common.c (valid_array_size_p): Add complain parameter.
+       * c-common.h: ...which defaults to true.
+
 2018-05-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/85696
index e8bb3eb23f8feef703306c919c14a4652df60c8a..859eeb472529da90e8593dca08b149fc93abd368 100644 (file)
@@ -7872,17 +7872,20 @@ reject_gcc_builtin (const_tree expr, location_t loc /* = UNKNOWN_LOCATION */)
    the name of the array, or NULL_TREE for unnamed arrays.  */
 
 bool
-valid_array_size_p (location_t loc, tree type, tree name)
+valid_array_size_p (location_t loc, tree type, tree name, bool complain)
 {
   if (type != error_mark_node
       && COMPLETE_TYPE_P (type)
       && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST
       && !valid_constant_size_p (TYPE_SIZE_UNIT (type)))
     {
-      if (name)
-       error_at (loc, "size of array %qE is too large", name);
-      else
-       error_at (loc, "size of unnamed array is too large");
+      if (complain)
+       {
+         if (name)
+           error_at (loc, "size of array %qE is too large", name);
+         else
+           error_at (loc, "size of unnamed array is too large");
+       }
       return false;
     }
   return true;
index f2c66628e53316ca12885cbd32cdec84e5ca162e..c266fee74c70612dc1a40774ea2ded8705834755 100644 (file)
@@ -1248,7 +1248,7 @@ extern tree find_inv_trees (tree *, int *, void *);
 extern tree replace_inv_trees (tree *, int *, void *);
 
 extern bool reject_gcc_builtin (const_tree, location_t = UNKNOWN_LOCATION);
-extern bool valid_array_size_p (location_t, tree, tree);
+extern bool valid_array_size_p (location_t, tree, tree, bool = true);
 
 /* In c-warn.c.  */
 extern void constant_expression_warning (tree);
index 08cd81ffcee3fe8237128cf2aa5a3aff6e4ee4d5..745059844bdf6b5126078e3fbb58a3a9b6488fd4 100644 (file)
@@ -1,3 +1,8 @@
+2018-05-14  Jason Merrill  <jason@redhat.com>
+
+       * pt.c (tsubst) [ARRAY_TYPE]: Check valid_array_size_p.
+       (tsubst_copy_and_build) [NEW_EXPR]: Clear in_decl.
+
 2018-05-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/85696
index 790d6ea25e9bcf507b0319e16040c99a65ce8e04..cd9011b1b61b8b0ff37a2dd3752ef14e7c235c7d 100644 (file)
@@ -14788,6 +14788,10 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
 
        r = build_cplus_array_type (type, domain);
 
+       if (!valid_array_size_p (input_location, r, in_decl,
+                                (complain & tf_error)))
+         return error_mark_node;
+
        if (TYPE_USER_ALIGN (t))
          {
            SET_TYPE_ALIGN (r, TYPE_ALIGN (t));
@@ -18147,6 +18151,9 @@ tsubst_copy_and_build (tree t,
              }
          }
 
+       /* Avoid passing an enclosing decl to valid_array_size_p.  */
+       in_decl = NULL_TREE;
+
        tree op1 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
        tree op2 = RECUR (TREE_OPERAND (t, 2));
        ret = build_new (&placement_vec, op1, op2, &init_vec,
index 37da525bf7811aeed197038bf7494a9688f18f1e..a03e231cbfe97da291e69cce5b90c74f64d74d8a 100644 (file)
@@ -22,7 +22,7 @@ template <typename T>
 void
 large_array_template1(int n)
 {
-  new T[n] // { dg-error "size of array is too large" }
+  new T[n] // { dg-error "size of unnamed array is too large" }
     [(1ULL << (sizeof(void *) * 4)) / sizeof(T)]
     [1ULL << (sizeof(void *) * 4)];
 }
@@ -31,7 +31,7 @@ template <typename T>
 void
 large_array_template2(int n)
 {
-  new T[n] // { dg-error "size of array is too large" }
+  new T[n] // { dg-error "size of unnamed array is too large" }
     [(1ULL << (sizeof(void *) * 4)) / sizeof(T)]
     [1ULL << (sizeof(void *) * 4)];
 }
@@ -40,7 +40,7 @@ template <typename T>
 void
 large_array_template3(int n)
 {
-  new T[n] // { dg-error "size of array is too large" }
+  new T[n] // { dg-error "size of unnamed array is too large" }
     [(1ULL << (sizeof(void *) * 4)) / sizeof(T)]
     [1ULL << (sizeof(void *) * 4)];
 }
diff --git a/gcc/testsuite/g++.dg/template/array30.C b/gcc/testsuite/g++.dg/template/array30.C
new file mode 100644 (file)
index 0000000..3608c2e
--- /dev/null
@@ -0,0 +1,7 @@
+template <int I>
+struct A
+{
+  int ar[I][I][I][I][I][I][I][I][I][I]; // { dg-error "too large" }
+};
+
+A<66000> a;