Don't crash lowering self-referential variable initializer.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Feb 2011 19:34:33 +0000 (19:34 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 15 Feb 2011 19:34:33 +0000 (19:34 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@170194 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/go/gofrontend/gogo.cc

index e3c56b6..0be8c66 100644 (file)
@@ -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.