Commit 7cfc62ba by Ian Lance Taylor

Don't crash on index into erroneous map.

From-SVN: r168185
parent 8332d80e
...@@ -9630,7 +9630,8 @@ Map_type* ...@@ -9630,7 +9630,8 @@ Map_type*
Map_index_expression::get_map_type() const Map_index_expression::get_map_type() const
{ {
Map_type* mt = this->map_->type()->deref()->map_type(); Map_type* mt = this->map_->type()->deref()->map_type();
gcc_assert(mt != NULL); if (mt == NULL)
gcc_assert(saw_errors());
return mt; return mt;
} }
...@@ -9649,7 +9650,10 @@ Map_index_expression::do_traverse(Traverse* traverse) ...@@ -9649,7 +9650,10 @@ Map_index_expression::do_traverse(Traverse* traverse)
Type* Type*
Map_index_expression::do_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 // If this map index is in a tuple assignment, we actually return a
// pointer to the value type. Tuple_map_assignment_statement is // pointer to the value type. Tuple_map_assignment_statement is
// responsible for handling this correctly. We need to get the type // responsible for handling this correctly. We need to get the type
...@@ -9665,7 +9669,9 @@ void ...@@ -9665,7 +9669,9 @@ void
Map_index_expression::do_determine_type(const Type_context*) Map_index_expression::do_determine_type(const Type_context*)
{ {
this->map_->determine_type_no_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); this->index_->determine_type(&subcontext);
} }
...@@ -9675,8 +9681,10 @@ void ...@@ -9675,8 +9681,10 @@ void
Map_index_expression::do_check_types(Gogo*) Map_index_expression::do_check_types(Gogo*)
{ {
std::string reason; std::string reason;
if (!Type::are_assignable(this->get_map_type()->key_type(), Map_type* mt = this->get_map_type();
this->index_->type(), &reason)) if (mt == NULL)
return;
if (!Type::are_assignable(mt->key_type(), this->index_->type(), &reason))
{ {
if (reason.empty()) if (reason.empty())
this->report_error(_("incompatible type for map index")); this->report_error(_("incompatible type for map index"));
...@@ -9695,6 +9703,8 @@ tree ...@@ -9695,6 +9703,8 @@ tree
Map_index_expression::do_get_tree(Translate_context* context) Map_index_expression::do_get_tree(Translate_context* context)
{ {
Map_type* type = this->get_map_type(); Map_type* type = this->get_map_type();
if (type == NULL)
return error_mark_node;
tree valptr = this->get_value_pointer(context, this->is_lvalue_); tree valptr = this->get_value_pointer(context, this->is_lvalue_);
if (valptr == error_mark_node) if (valptr == error_mark_node)
...@@ -9732,6 +9742,8 @@ Map_index_expression::get_value_pointer(Translate_context* context, ...@@ -9732,6 +9742,8 @@ Map_index_expression::get_value_pointer(Translate_context* context,
bool insert) bool insert)
{ {
Map_type* type = this->get_map_type(); Map_type* type = this->get_map_type();
if (type == NULL)
return error_mark_node;
tree map_tree = this->map_->get_tree(context); tree map_tree = this->map_->get_tree(context);
tree index_tree = this->index_->get_tree(context); tree index_tree = this->index_->get_tree(context);
......
...@@ -3160,7 +3160,12 @@ Type* ...@@ -3160,7 +3160,12 @@ Type*
Variable::type_from_tuple(Expression* expr, bool report_error) const Variable::type_from_tuple(Expression* expr, bool report_error) const
{ {
if (expr->map_index_expression() != NULL) 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) else if (expr->receive_expression() != NULL)
{ {
Expression* channel = expr->receive_expression()->channel(); Expression* channel = expr->receive_expression()->channel();
......
...@@ -922,6 +922,8 @@ Tuple_map_assignment_statement::do_lower(Gogo*, Block* enclosing) ...@@ -922,6 +922,8 @@ Tuple_map_assignment_statement::do_lower(Gogo*, Block* enclosing)
return Statement::make_error_statement(loc); return Statement::make_error_statement(loc);
} }
Map_type* map_type = map_index->get_map_type(); 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); Block* b = new Block(enclosing, loc);
...@@ -1066,6 +1068,8 @@ Map_assignment_statement::do_lower(Gogo*, Block* enclosing) ...@@ -1066,6 +1068,8 @@ Map_assignment_statement::do_lower(Gogo*, Block* enclosing)
return Statement::make_error_statement(loc); return Statement::make_error_statement(loc);
} }
Map_type* map_type = map_index->get_map_type(); 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); Block* b = new Block(enclosing, loc);
......
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