diff --git a/src/treeopt.in b/src/treeopt.in index 58836ae9f482096016d01ad90ab7169de0d86118..cebe145de001648cf01b059878ac8e8383dac0a2 100644 --- a/src/treeopt.in +++ b/src/treeopt.in @@ -1063,8 +1063,21 @@ F_DO(-, 0 = +[node_is_true($$)]): // No body -- No reason to loop... -F_FOREACH(F_VAL_LVAL(0, *), -): - F_POP_VALUE($0, -); +F_FOREACH(F_VAL_LVAL(0 = +[!($$->node_info & (OPT_SIDE_EFFECT|OPT_ASSIGNMENT))], + 1 = +[($$->token != ':')]), -): +{ + // Note: We still need to set the loop variable as if the last + // turn of the loop has executed, in case it is used later. + $$ = mknode(F_POP_VALUE, + mknode('?', + mkefuncallnode("sizeof", $0), + mknode(':', + mknode(F_ASSIGN, + mknode(F_INDEX, $0, mkintnode(-1)), $1), + NULL)), + 0); +} +; F_LOOP(0, -): F_POP_VALUE($0, -);