From 403962eac2c99fc7510fbd4164f0a56fb7a15d0c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 14 May 2018 10:49:45 -0400 Subject: [PATCH] pt.c (tsubst): Check valid_array_size_p. * 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 | 5 +++++ gcc/c-family/c-common.c | 13 ++++++++----- gcc/c-family/c-common.h | 2 +- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 7 +++++++ gcc/testsuite/g++.dg/init/new38.C | 6 +++--- gcc/testsuite/g++.dg/template/array30.C | 7 +++++++ 7 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/array30.C diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index c38d5ecac89..27bdd2ddb1d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2018-05-09 Jason Merrill + + * c-common.c (valid_array_size_p): Add complain parameter. + * c-common.h: ...which defaults to true. + 2018-05-11 Jakub Jelinek PR c/85696 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index e8bb3eb23f8..859eeb47252 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -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; diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index f2c66628e53..c266fee74c7 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -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); diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 08cd81ffcee..745059844bd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-05-14 Jason Merrill + + * pt.c (tsubst) [ARRAY_TYPE]: Check valid_array_size_p. + (tsubst_copy_and_build) [NEW_EXPR]: Clear in_decl. + 2018-05-11 Jakub Jelinek PR c/85696 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 790d6ea25e9..cd9011b1b61 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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, diff --git a/gcc/testsuite/g++.dg/init/new38.C b/gcc/testsuite/g++.dg/init/new38.C index 37da525bf78..a03e231cbfe 100644 --- a/gcc/testsuite/g++.dg/init/new38.C +++ b/gcc/testsuite/g++.dg/init/new38.C @@ -22,7 +22,7 @@ template 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 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 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 index 00000000000..3608c2e1233 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/array30.C @@ -0,0 +1,7 @@ +template +struct A +{ + int ar[I][I][I][I][I][I][I][I][I][I]; // { dg-error "too large" } +}; + +A<66000> a; -- 2.30.2