Commit 0a43d680 by Richard Kenner

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

and use care to avoid mixed-type operations.

From-SVN: r6787
parent 0207ea82
...@@ -4265,21 +4265,25 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) ...@@ -4265,21 +4265,25 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
error ("size of array `%s' has non-integer type", name); error ("size of array `%s' has non-integer type", name);
size = integer_one_node; size = integer_one_node;
} }
if (pedantic && integer_zerop (size)) if (pedantic && integer_zerop (size))
pedwarn ("ANSI C forbids zero-size array `%s'", name); pedwarn ("ANSI C forbids zero-size array `%s'", name);
if (TREE_CODE (size) == INTEGER_CST) if (TREE_CODE (size) == INTEGER_CST)
{ {
constant_expression_warning (size); 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); error ("size of array `%s' is negative", name);
size = integer_one_node; size = integer_one_node;
} }
itype = build_index_type (size_binop (MINUS_EXPR, size,
size_one_node));
} }
else 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 (pedantic)
{ {
if (TREE_CONSTANT (size)) if (TREE_CONSTANT (size))
...@@ -4287,14 +4291,16 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) ...@@ -4287,14 +4291,16 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
else else
pedwarn ("ANSI C forbids variable-size array `%s'", name); 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 #if 0 /* This had bad results for pointers to arrays, as in
......
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