Consider the following function. static _Bool foo(int x) { return x; } Currently sparse emits: scast.1 %r2 <- (32) %arg1 ret.1 %r2 This is incorrect since bool requires a zero test. setne.32 %r2 <- %arg1, $0 ret.1 %r2 This patch adds zero testing for bool in cast_to(). Signed-off-by: Xi Wang <xi.wang@xxxxxxxxx> --- evaluate.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/evaluate.c b/evaluate.c index d9c767f..a090028 100644 --- a/evaluate.c +++ b/evaluate.c @@ -272,6 +272,18 @@ static struct expression * cast_to(struct expression *old, struct symbol *type) if (old->ctype != &null_ctype && is_same_type(old, type)) return old; + /* bool requires a zero test */ + if (is_bool_type(type)) { + expr = alloc_expression(old->pos, EXPR_COMPARE); + expr->op = SPECIAL_NOTEQUAL; + expr->ctype = type; + expr->left = old; + expr->right = alloc_expression(old->pos, EXPR_VALUE); + expr->right->ctype = old->ctype; + expr->right->value = 0; + return expr; + } + /* * See if we can simplify the op. Move the cast down. */ -- 1.8.1.2 -- 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