summaryrefslogtreecommitdiffstats
path: root/elaborate.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'elaborate.cxx')
-rw-r--r--elaborate.cxx18
1 files changed, 10 insertions, 8 deletions
diff --git a/elaborate.cxx b/elaborate.cxx
index 75714102..abb4c73b 100644
--- a/elaborate.cxx
+++ b/elaborate.cxx
@@ -696,8 +696,7 @@ struct symbol_fetcher
{
symbol *&sym;
- symbol_fetcher (symbol *&sym)
- : sym(sym)
+ symbol_fetcher (symbol *&sym): sym(sym)
{}
void visit_symbol (symbol* e)
@@ -705,6 +704,11 @@ struct symbol_fetcher
sym = e;
}
+ void visit_target_symbol (target_symbol* e)
+ {
+ sym = e;
+ }
+
void visit_arrayindex (arrayindex* e)
{
e->base->visit_indexable (this);
@@ -722,9 +726,7 @@ get_symbol_within_expression (expression *e)
symbol *sym = NULL;
symbol_fetcher fetcher(sym);
e->visit (&fetcher);
- if (!sym)
- throw semantic_error("Unable to find symbol in expression", e->tok);
- return sym;
+ return sym; // NB: may be null!
}
static symbol *
@@ -1718,12 +1720,12 @@ void
dead_assignment_remover::visit_assignment (assignment* e)
{
symbol* left = get_symbol_within_expression (e->left);
- vardecl* leftvar = left->referent;
+ vardecl* leftvar = left->referent; // NB: may be 0 for unresolved $target
if (current_expr && // see XXX above: this case represents a missed
// optimization opportunity
- *current_expr == e) // we're not nested any deeper than expected
+ *current_expr == e && // we're not nested any deeper than expected
+ leftvar) // not unresolved $target; intended sideeffect cannot be elided
{
- // clog << "Checking assignment to " << leftvar->name << " at " << *e->tok << endl;
if (vut.read.find(leftvar) == vut.read.end()) // var never read?
{
// NB: Not so fast! The left side could be an array whose