Commit 72f812a2 by Ian Lance Taylor

Don't crash lowering self-referential variable initializer.

From-SVN: r170194
parent 1c4a5fc8
...@@ -1139,7 +1139,8 @@ class Lower_parse_tree : public Traverse ...@@ -1139,7 +1139,8 @@ class Lower_parse_tree : public Traverse
{ {
public: public:
Lower_parse_tree(Gogo* gogo, Named_object* function) Lower_parse_tree(Gogo* gogo, Named_object* function)
: Traverse(traverse_constants : Traverse(traverse_variables
| traverse_constants
| traverse_functions | traverse_functions
| traverse_statements | traverse_statements
| traverse_expressions), | traverse_expressions),
...@@ -1147,6 +1148,9 @@ class Lower_parse_tree : public Traverse ...@@ -1147,6 +1148,9 @@ class Lower_parse_tree : public Traverse
{ } { }
int int
variable(Named_object*);
int
constant(Named_object*, bool); constant(Named_object*, bool);
int int
...@@ -1167,6 +1171,18 @@ class Lower_parse_tree : public Traverse ...@@ -1167,6 +1171,18 @@ class Lower_parse_tree : public Traverse
int iota_value_; int iota_value_;
}; };
// Lower variables. We handle variables specially to break loops in
// which a variable initialization expression refers to itself. The
// loop breaking is in lower_init_expression.
int
Lower_parse_tree::variable(Named_object* no)
{
if (no->is_variable())
no->var_value()->lower_init_expression(this->gogo_, this->function_);
return TRAVERSE_CONTINUE;
}
// Lower constants. We handle constants specially so that we can set // Lower constants. We handle constants specially so that we can set
// the right value for the predeclared constant iota. This works in // the right value for the predeclared constant iota. This works in
// conjunction with the way we lower Const_expression objects. // conjunction with the way we lower Const_expression objects.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment