diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2010-12-14 19:27:07 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2010-12-14 19:27:07 +0000 |
commit | cd96b4e2dbe471bbf3e743cd571b9a16f002a8a7 (patch) | |
tree | 310e9976ba5a3f26a539a8c933f3bd626698332e | |
parent | 7ed66e6669a256d701ea2b41c5ec340729d3aeca (diff) | |
download | gcc-cd96b4e2dbe471bbf3e743cd571b9a16f002a8a7.zip gcc-cd96b4e2dbe471bbf3e743cd571b9a16f002a8a7.tar.gz gcc-cd96b4e2dbe471bbf3e743cd571b9a16f002a8a7.tar.bz2 |
Correct handling of undefined name as key in map composite literal.
From-SVN: r167810
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 21 | ||||
-rw-r--r-- | gcc/go/gofrontend/expressions.h | 6 |
2 files changed, 22 insertions, 5 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index 6320f09..cb73ea9 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -11162,7 +11162,7 @@ class Composite_literal_expression : public Parser_expression make_array(Type*, Expression_list*); Expression* - lower_map(Type*); + lower_map(Gogo*, Named_object*, Type*); // The type of the composite literal. Type* type_; @@ -11191,7 +11191,7 @@ Composite_literal_expression::do_traverse(Traverse* traverse) // the type. Expression* -Composite_literal_expression::do_lower(Gogo*, Named_object*, int) +Composite_literal_expression::do_lower(Gogo* gogo, Named_object* function, int) { Type* type = this->type_; @@ -11218,7 +11218,7 @@ Composite_literal_expression::do_lower(Gogo*, Named_object*, int) else if (type->array_type() != NULL) return this->lower_array(type); else if (type->map_type() != NULL) - return this->lower_map(type); + return this->lower_map(gogo, function, type); else { error_at(this->location(), @@ -11477,7 +11477,8 @@ Composite_literal_expression::make_array(Type* type, Expression_list* vals) // Lower a map composite literal. Expression* -Composite_literal_expression::lower_map(Type* type) +Composite_literal_expression::lower_map(Gogo* gogo, Named_object* function, + Type* type) { source_location location = this->location(); if (this->vals_ != NULL) @@ -11488,7 +11489,7 @@ Composite_literal_expression::lower_map(Type* type) return Expression::make_error(location); } - for (Expression_list::const_iterator p = this->vals_->begin(); + for (Expression_list::iterator p = this->vals_->begin(); p != this->vals_->end(); p += 2) { @@ -11499,6 +11500,16 @@ Composite_literal_expression::lower_map(Type* type) "map composite literal must have keys for every value"); return Expression::make_error(location); } + // Make sure we have lowered the key; it may not have been + // lowered in order to handle keys for struct composite + // literals. Lower it now to get the right error message. + if ((*p)->unknown_expression() != NULL) + { + (*p)->unknown_expression()->clear_is_composite_literal_key(); + gogo->lower_expression(function, &*p); + gcc_assert((*p)->is_error_expression()); + return Expression::make_error(location); + } } } diff --git a/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h index 4d539d4..53cca06 100644 --- a/gcc/go/gofrontend/expressions.h +++ b/gcc/go/gofrontend/expressions.h @@ -1384,6 +1384,12 @@ class Unknown_expression : public Parser_expression set_is_composite_literal_key() { this->is_composite_literal_key_ = true; } + // Note that this expression should no longer be treated as a + // composite literal key. + void + clear_is_composite_literal_key() + { this->is_composite_literal_key_ = false; } + protected: Expression* do_lower(Gogo*, Named_object*, int); |