From 019c06baa2ade613110ab45d9e15de277ad4c4ec Mon Sep 17 00:00:00 2001 From: Dan Carpenter Date: Thu, 9 May 2013 10:07:54 +0300 Subject: [PATCH] implied: preserve equivalence across switch statements This should be using the set_extra_nomod() helper so that the equivalent variables are updated as well. Signed-off-by: Dan Carpenter --- smatch_implied.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/smatch_implied.c b/smatch_implied.c index 502fa8f3..b29167ce 100644 --- a/smatch_implied.c +++ b/smatch_implied.c @@ -577,6 +577,7 @@ struct state_list *__implied_case_slist(struct expression *switch_expr, struct sm_state *sm; struct state_list *true_states = NULL; struct state_list *false_states = NULL; + struct state_list *extra_states = NULL; struct state_list *ret = clone_slist(*raw_slist); sval_t sval; struct range_list *vals = NULL; @@ -600,8 +601,13 @@ struct state_list *__implied_case_slist(struct expression *switch_expr, if (sm) separate_and_filter(sm, SPECIAL_EQUAL, vals, LEFT, *raw_slist, &true_states, &false_states); - set_state_slist(&true_states, SMATCH_EXTRA, name, sym, alloc_estate_rl(vals)); + __push_fake_cur_slist(); + __unnullify_path(); + set_extra_nomod(name, sym, alloc_estate_rl(vals)); + extra_states = __pop_fake_cur_slist(); + overwrite_slist(extra_states, &true_states); overwrite_slist(true_states, &ret); + free_slist(&extra_states); free_slist(&true_states); free_slist(&false_states); free: -- 2.11.4.GIT