summaryrefslogtreecommitdiffstats
path: root/elaborate.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'elaborate.cxx')
-rw-r--r--elaborate.cxx9
1 files changed, 7 insertions, 2 deletions
diff --git a/elaborate.cxx b/elaborate.cxx
index 3db165d4..61e63cb1 100644
--- a/elaborate.cxx
+++ b/elaborate.cxx
@@ -1306,7 +1306,10 @@ struct dead_assignment_remover: public traversing_visitor
session(s), relaxed_p(r), vut(v), current_expr(0) {}
void visit_expr_statement (expr_statement* s);
- // XXX: and other places where an assignment may be nested
+ // XXX: other places where an assignment may be nested should be
+ // handled too (e.g., loop/if conditionals, array indexes, function
+ // parameters). Until then, they result in visit_assignment() being
+ // called with null current_expr.
void visit_assignment (assignment* e);
};
@@ -1328,7 +1331,9 @@ dead_assignment_remover::visit_assignment (assignment* e)
{
symbol* left = get_symbol_within_expression (e->left);
vardecl* leftvar = left->referent;
- if (*current_expr == e) // we're not nested any deeper than expected
+ if (current_expr && // see XXX above: this case represents a missed
+ // optimization opportunity
+ *current_expr == e) // we're not nested any deeper than expected
{
// clog << "Checking assignment to " << leftvar->name << " at " << *e->tok << endl;
if (vut.read.find(leftvar) == vut.read.end()) // var never read?