- /* Self-referencing assignments can't be inlined without additional
- work. Just clear any previous expression. */
- i->second.expression = (assign.self_referencing ? 0 : assign.right.get());
- i->second.assign_scope = current_block;
- i->second.inline_point = 0;
- i->second.available = true;
+ if(iteration_body && i->second->expression)
+ {
+ /* Block inlining into previous references within the iteration
+ statement. On iterations after the first they would refer to the
+ assignment within the iteration. */
+ for(ExpressionUse &u: i->second->uses)
+ for(Block *k=u.ref_scope; (!u.blocked && k); k=k->parent)
+ u.blocked = (k==iteration_body);
+ }
+
+ expressions.push_back(ExpressionInfo());
+ ExpressionInfo &info = expressions.back();
+ info.target = assign.target;
+ // Self-referencing assignments can't be inlined without additional work.
+ if(!assign.self_referencing)
+ info.expression = assign.right;
+ info.assign_scope = current_block;
+ info.trivial = r_trivial;
+
+ i->second = &info;