aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2010-12-22 23:24:33 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-12-22 23:24:33 +0000
commit7cfc62ba9e973c3c47d0c6e47009959115546ab0 (patch)
treedb08969db81beda62fb5cb5e6ec3055828033bf9 /gcc/go
parent8332d80edb206e7de917f8a9f01ab6eec3ce8231 (diff)
downloadgcc-7cfc62ba9e973c3c47d0c6e47009959115546ab0.zip
gcc-7cfc62ba9e973c3c47d0c6e47009959115546ab0.tar.gz
gcc-7cfc62ba9e973c3c47d0c6e47009959115546ab0.tar.bz2
Don't crash on index into erroneous map.
From-SVN: r168185
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/expressions.cc22
-rw-r--r--gcc/go/gofrontend/gogo.cc7
-rw-r--r--gcc/go/gofrontend/statements.cc4
3 files changed, 27 insertions, 6 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index de07a1d..491b71a 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -9630,7 +9630,8 @@ Map_type*
Map_index_expression::get_map_type() const
{
Map_type* mt = this->map_->type()->deref()->map_type();
- gcc_assert(mt != NULL);
+ if (mt == NULL)
+ gcc_assert(saw_errors());
return mt;
}
@@ -9649,7 +9650,10 @@ Map_index_expression::do_traverse(Traverse* traverse)
Type*
Map_index_expression::do_type()
{
- Type* type = this->get_map_type()->val_type();
+ Map_type* mt = this->get_map_type();
+ if (mt == NULL)
+ return Type::make_error_type();
+ Type* type = mt->val_type();
// If this map index is in a tuple assignment, we actually return a
// pointer to the value type. Tuple_map_assignment_statement is
// responsible for handling this correctly. We need to get the type
@@ -9665,7 +9669,9 @@ void
Map_index_expression::do_determine_type(const Type_context*)
{
this->map_->determine_type_no_context();
- Type_context subcontext(this->get_map_type()->key_type(), false);
+ Map_type* mt = this->get_map_type();
+ Type* key_type = mt == NULL ? NULL : mt->key_type();
+ Type_context subcontext(key_type, false);
this->index_->determine_type(&subcontext);
}
@@ -9675,8 +9681,10 @@ void
Map_index_expression::do_check_types(Gogo*)
{
std::string reason;
- if (!Type::are_assignable(this->get_map_type()->key_type(),
- this->index_->type(), &reason))
+ Map_type* mt = this->get_map_type();
+ if (mt == NULL)
+ return;
+ if (!Type::are_assignable(mt->key_type(), this->index_->type(), &reason))
{
if (reason.empty())
this->report_error(_("incompatible type for map index"));
@@ -9695,6 +9703,8 @@ tree
Map_index_expression::do_get_tree(Translate_context* context)
{
Map_type* type = this->get_map_type();
+ if (type == NULL)
+ return error_mark_node;
tree valptr = this->get_value_pointer(context, this->is_lvalue_);
if (valptr == error_mark_node)
@@ -9732,6 +9742,8 @@ Map_index_expression::get_value_pointer(Translate_context* context,
bool insert)
{
Map_type* type = this->get_map_type();
+ if (type == NULL)
+ return error_mark_node;
tree map_tree = this->map_->get_tree(context);
tree index_tree = this->index_->get_tree(context);
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index 634eccd..aa62ce6 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -3160,7 +3160,12 @@ Type*
Variable::type_from_tuple(Expression* expr, bool report_error) const
{
if (expr->map_index_expression() != NULL)
- return expr->map_index_expression()->get_map_type()->val_type();
+ {
+ Map_type* mt = expr->map_index_expression()->get_map_type();
+ if (mt == NULL)
+ return Type::make_error_type();
+ return mt->val_type();
+ }
else if (expr->receive_expression() != NULL)
{
Expression* channel = expr->receive_expression()->channel();
diff --git a/gcc/go/gofrontend/statements.cc b/gcc/go/gofrontend/statements.cc
index fcc16d1..b5ded99 100644
--- a/gcc/go/gofrontend/statements.cc
+++ b/gcc/go/gofrontend/statements.cc
@@ -922,6 +922,8 @@ Tuple_map_assignment_statement::do_lower(Gogo*, Block* enclosing)
return Statement::make_error_statement(loc);
}
Map_type* map_type = map_index->get_map_type();
+ if (map_type == NULL)
+ return Statement::make_error_statement(loc);
Block* b = new Block(enclosing, loc);
@@ -1066,6 +1068,8 @@ Map_assignment_statement::do_lower(Gogo*, Block* enclosing)
return Statement::make_error_statement(loc);
}
Map_type* map_type = map_index->get_map_type();
+ if (map_type == NULL)
+ return Statement::make_error_statement(loc);
Block* b = new Block(enclosing, loc);