From 6ed98066f6d184f2f0f918570aaa6a1934668ac2 Mon Sep 17 00:00:00 2001 From: Luc Van Oostenryck Date: Wed, 31 May 2017 15:00:49 +0200 Subject: force to 0 expressions which are erroneously non-constant When an expression that needs to be constant but is, in fact, not constant, sparse throws an error and leaves it as-is. But some code makes the assumption that the expression is constant and uses its value, with some random result. One situation where this happens is in code like: switch (x) { case : ... In this case, the linearization of the switch/case statement will unconditionally use the value of the case expression but the expression has no value. One way to avoid this would be to add defensive checks each time a value is retrieved but this is a lot of work and time for no benefits. So, change this by forcing the expression to be a constant value of 0 just after the error message has been issued. Signed-off-by: Luc Van Oostenryck --- expand.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/expand.c b/expand.c index 623b1800..c4f806de 100644 --- a/expand.c +++ b/expand.c @@ -1177,8 +1177,12 @@ static void expand_const_expression(struct expression *expr, const char *where) { if (expr) { expand_expression(expr); - if (expr->type != EXPR_VALUE) + if (expr->type != EXPR_VALUE) { expression_error(expr, "Expected constant expression in %s", where); + expr->ctype = &int_ctype; + expr->type = EXPR_VALUE; + expr->value = 0; + } } } -- cgit 1.2.3-korg