aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-01-04 21:15:26 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-01-04 21:15:26 +0000
commiteb83e2d7f0f746bf64276ebb3931b20ae0cd7398 (patch)
treefa876fbc35a8a9da0c569dcc86d12331cb6fe42c
parent1ed36e906f6cf62a4d4dad1c8989257eb97f5566 (diff)
downloadgcc-eb83e2d7f0f746bf64276ebb3931b20ae0cd7398.zip
gcc-eb83e2d7f0f746bf64276ebb3931b20ae0cd7398.tar.gz
gcc-eb83e2d7f0f746bf64276ebb3931b20ae0cd7398.tar.bz2
Don't crash if tuple init redefines non-variable.
From-SVN: r168484
-rw-r--r--gcc/go/gofrontend/parse.cc30
1 files changed, 24 insertions, 6 deletions
diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc
index 13374f4..9e62583 100644
--- a/gcc/go/gofrontend/parse.cc
+++ b/gcc/go/gofrontend/parse.cc
@@ -1655,9 +1655,15 @@ Parse::init_vars_from_map(const Typed_identifier_list* vars, Type* type,
if (!this->gogo_->in_global_scope())
this->gogo_->add_statement(s);
else if (!val_no->is_sink())
- val_no->var_value()->add_preinit_statement(s);
+ {
+ if (val_no->is_variable())
+ val_no->var_value()->add_preinit_statement(s);
+ }
else if (!no->is_sink())
- no->var_value()->add_preinit_statement(s);
+ {
+ if (no->is_variable())
+ no->var_value()->add_preinit_statement(s);
+ }
else
{
// Execute the map index expression just so that we can fail if
@@ -1716,9 +1722,15 @@ Parse::init_vars_from_receive(const Typed_identifier_list* vars, Type* type,
if (!this->gogo_->in_global_scope())
this->gogo_->add_statement(s);
else if (!val_no->is_sink())
- val_no->var_value()->add_preinit_statement(s);
+ {
+ if (val_no->is_variable())
+ val_no->var_value()->add_preinit_statement(s);
+ }
else if (!no->is_sink())
- no->var_value()->add_preinit_statement(s);
+ {
+ if (no->is_variable())
+ no->var_value()->add_preinit_statement(s);
+ }
else
{
Named_object* dummy = this->create_dummy_global(Type::lookup_bool_type(),
@@ -1776,9 +1788,15 @@ Parse::init_vars_from_type_guard(const Typed_identifier_list* vars,
if (!this->gogo_->in_global_scope())
this->gogo_->add_statement(s);
else if (!val_no->is_sink())
- val_no->var_value()->add_preinit_statement(s);
+ {
+ if (val_no->is_variable())
+ val_no->var_value()->add_preinit_statement(s);
+ }
else if (!no->is_sink())
- no->var_value()->add_preinit_statement(s);
+ {
+ if (no->is_variable())
+ no->var_value()->add_preinit_statement(s);
+ }
else
{
Named_object* dummy = this->create_dummy_global(type, NULL, location);