summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--elaborate.cxx9
-rwxr-xr-xtestsuite/semok/optimize.stp5
3 files changed, 18 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 3bea623f..968abc24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-24 Frank Ch. Eigler <fche@elastic.org>
+
+ PR 2599.
+ * elaborate.cxx (visit_assignment): Tolerate null current_expr.
+ * testsuite/semok/optimize.stp: Add relevant tests.
+
2006-04-23 Eugene Teo <eteo@redhat.com>
PR 2149
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?
diff --git a/testsuite/semok/optimize.stp b/testsuite/semok/optimize.stp
index 28ccb46c..bcf8ac04 100755
--- a/testsuite/semok/optimize.stp
+++ b/testsuite/semok/optimize.stp
@@ -16,3 +16,8 @@ probe begin {
b = "goodbye"
no . $such . $target + $variable
}
+
+# bug #2599
+probe begin{for(i=1;i-=2;i++);}
+probe begin{while(i+=2);}
+probe begin{if(i=j);}