* Richard Guenther:
> On Wed, Jan 19, 2011 at 10:53 PM, Florian Weimer <[email protected]> wrote:
>> I get strange warnings when I do arithmetic involving TYPE_MAX_VALUE
>> (size_type_node), in particular this code:
>>
>> /* Multiplies MUL1 with MUL2, and adds ADD. Returns (size_t)-1 if the
>> result cannot be be represented as a size_t value. If ADD is
>> null_tree, treat it as a zero constant.
>> */
>> tree
>> build_size_mult_saturated (tree mul1, tree mul2, tree add)
>> {
>> tree max_mul1, result;
>> max_mul1 = TYPE_MAX_VALUE (size_type_node);
>> if (add != NULL_TREE)
>> max_mul1 = size_binop(MINUS_EXPR, max_mul1, add);
>> max_mul1 = size_binop(TRUNC_DIV_EXPR, max_mul1, mul2);
>> result = size_binop (MULT_EXPR, mul1, mul2);
>> if (add != NULL_TREE)
>> result = size_binop (PLUS_EXPR, result, add);
>> return build3 (COND_EXPR, sizetype,
>> build2 (EQ_EXPR, sizetype, mul2, size_zero_node),
>> add == NULL_TREE ? size_zero_node : add,
>> build3 (COND_EXPR, sizetype,
>> build2 (LE_EXPR, sizetype, mul1, max_mul1),
>> result, TYPE_MAX_VALUE (size_type_node)));
>> }
>>
>> Is size_type_node really signed, and does TYPE_MAX_VALUE
>> (size_type_node) lie outside the representable range? Is there an
>> easy way to get a GCC type closely matching size_t in C++?
>
> The size_* functions are supposed to be used with sizetype,
> not with size_type ;) sizetypes are strange beast.
Thanks for the suggestion. TYPE_MAX_VALUE (sizetype) appears to be
-1, as the result of this code in stor-layout.c:
/* sizetype is unsigned but we need to fix TYPE_MAX_VALUE so that it is
sign-extended in a way consistent with force_fit_type. */
max = TYPE_MAX_VALUE (sizetype);
TYPE_MAX_VALUE (sizetype)
= double_int_to_tree (sizetype, tree_to_double_int (max));
Is there a way to obtain the actual maximum value?