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
{
public:
Lower_parse_tree(Gogo* gogo, Named_object* function)
: Traverse(traverse_constants
: Traverse(traverse_variables
| traverse_constants
| traverse_functions
| traverse_statements
| traverse_expressions),
......@@ -1147,6 +1148,9 @@ class Lower_parse_tree : public Traverse
{ }
int
variable(Named_object*);
int
constant(Named_object*, bool);
int
......@@ -1167,6 +1171,18 @@ class Lower_parse_tree : public Traverse
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
// the right value for the predeclared constant iota. This works in
// 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