Casting to _Bool requires a zero test rather than truncation. Also add a new cast warning for _Bool since this is not about truncation. Cc: Pekka Enberg <penberg@xxxxxxxxxx> Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> Cc: Dan Carpenter <dan.carpenter@xxxxxxxxxx> Signed-off-by: Xi Wang <xi.wang@xxxxxxxxx> --- expand.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/expand.c b/expand.c index 63a9075..fcdefcb 100644 --- a/expand.c +++ b/expand.c @@ -92,6 +92,14 @@ void cast_value(struct expression *expr, struct symbol *newtype, value = get_longlong(old); Int: + // _Bool requires a zero test rather than truncation. + if (is_bool_type(newtype)) { + expr->value = value ? 1 : 0; + if (!conservative && value != 0 && value != 1) + warning(old->pos, "odd constant _Bool cast (%llx becomes 1)", value); + return; + } + // Truncate it to the new size signmask = 1ULL << (new_size-1); mask = signmask | (signmask-1); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html