From 72f812a2b53cc8b57c10534784022fea020be891 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 15 Feb 2011 19:34:33 +0000 Subject: [PATCH] Don't crash lowering self-referential variable initializer. From-SVN: r170194 --- gcc/go/gofrontend/gogo.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index e3c56b6318d..0be8c66a83b 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -1139,13 +1139,17 @@ 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), gogo_(gogo), function_(function), iota_value_(-1) { } + int + variable(Named_object*); + int constant(Named_object*, bool); @@ -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. -- 2.30.2