Commit 403962ea by Jason Merrill Committed by Jason Merrill

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
parent 3846b8e4
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> 2018-05-11 Jakub Jelinek <jakub@redhat.com>
PR c/85696 PR c/85696
......
...@@ -7872,17 +7872,20 @@ reject_gcc_builtin (const_tree expr, location_t loc /* = UNKNOWN_LOCATION */) ...@@ -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. */ the name of the array, or NULL_TREE for unnamed arrays. */
bool 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 if (type != error_mark_node
&& COMPLETE_TYPE_P (type) && COMPLETE_TYPE_P (type)
&& TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST
&& !valid_constant_size_p (TYPE_SIZE_UNIT (type))) && !valid_constant_size_p (TYPE_SIZE_UNIT (type)))
{ {
if (complain)
{
if (name) if (name)
error_at (loc, "size of array %qE is too large", name); error_at (loc, "size of array %qE is too large", name);
else else
error_at (loc, "size of unnamed array is too large"); error_at (loc, "size of unnamed array is too large");
}
return false; return false;
} }
return true; return true;
......
...@@ -1248,7 +1248,7 @@ extern tree find_inv_trees (tree *, int *, void *); ...@@ -1248,7 +1248,7 @@ extern tree find_inv_trees (tree *, int *, void *);
extern tree replace_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 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. */ /* In c-warn.c. */
extern void constant_expression_warning (tree); extern void constant_expression_warning (tree);
......
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> 2018-05-11 Jakub Jelinek <jakub@redhat.com>
PR c/85696 PR c/85696
......
...@@ -14788,6 +14788,10 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) ...@@ -14788,6 +14788,10 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
r = build_cplus_array_type (type, domain); 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)) if (TYPE_USER_ALIGN (t))
{ {
SET_TYPE_ALIGN (r, TYPE_ALIGN (t)); SET_TYPE_ALIGN (r, TYPE_ALIGN (t));
...@@ -18147,6 +18151,9 @@ tsubst_copy_and_build (tree 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 op1 = tsubst (TREE_OPERAND (t, 1), args, complain, in_decl);
tree op2 = RECUR (TREE_OPERAND (t, 2)); tree op2 = RECUR (TREE_OPERAND (t, 2));
ret = build_new (&placement_vec, op1, op2, &init_vec, ret = build_new (&placement_vec, op1, op2, &init_vec,
......
...@@ -22,7 +22,7 @@ template <typename T> ...@@ -22,7 +22,7 @@ template <typename T>
void void
large_array_template1(int n) 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)) / sizeof(T)]
[1ULL << (sizeof(void *) * 4)]; [1ULL << (sizeof(void *) * 4)];
} }
...@@ -31,7 +31,7 @@ template <typename T> ...@@ -31,7 +31,7 @@ template <typename T>
void void
large_array_template2(int n) 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)) / sizeof(T)]
[1ULL << (sizeof(void *) * 4)]; [1ULL << (sizeof(void *) * 4)];
} }
...@@ -40,7 +40,7 @@ template <typename T> ...@@ -40,7 +40,7 @@ template <typename T>
void void
large_array_template3(int n) 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)) / sizeof(T)]
[1ULL << (sizeof(void *) * 4)]; [1ULL << (sizeof(void *) * 4)];
} }
......
template <int I>
struct A
{
int ar[I][I][I][I][I][I][I][I][I][I]; // { dg-error "too large" }
};
A<66000> a;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment