(grokdeclarator): Convert to sizetype when manipulating size of array

and use care to avoid mixed-type operations.

From-SVN: r6787
This commit is contained in:
Richard Kenner 1994-03-14 08:47:18 -05:00
parent 0207ea829b
commit 0a43d68083

View File

@ -4265,21 +4265,25 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
error ("size of array `%s' has non-integer type", name);
size = integer_one_node;
}
if (pedantic && integer_zerop (size))
pedwarn ("ANSI C forbids zero-size array `%s'", name);
if (TREE_CODE (size) == INTEGER_CST)
{
constant_expression_warning (size);
if (INT_CST_LT (size, integer_zero_node))
if (tree_int_cst_sgn (size) < 0)
{
error ("size of array `%s' is negative", name);
size = integer_one_node;
}
itype = build_index_type (size_binop (MINUS_EXPR, size,
size_one_node));
}
else
{
/* Make sure the array size remains visibly nonconstant
even if it is (eg) a const variable with known value. */
size_varies = 1;
if (pedantic)
{
if (TREE_CONSTANT (size))
@ -4287,14 +4291,16 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
else
pedwarn ("ANSI C forbids variable-size array `%s'", name);
}
itype = build_binary_op (MINUS_EXPR, size, integer_one_node,
1);
/* Make sure the array size remains visibly nonconstant
even if it is (eg) a const variable with known value. */
size_varies = 1;
itype = variable_size (itype);
itype = build_index_type (itype);
}
/* Convert size to sizetype, so that if it is a variable
the computations will be done in the proper mode. */
itype = fold (build (MINUS_EXPR, sizetype,
convert (sizetype, size), size_one_node));
if (size_varies)
itype = variable_size (itype);
itype = build_index_type (itype);
}
#if 0 /* This had bad results for pointers to arrays, as in