aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2014-10-18 00:41:42 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2014-10-18 00:41:42 +0000
commit7e813472a20d496c4dafb20a704932656bfc8366 (patch)
tree19087a93a9344d39f8020b915e9ca9a76e9b1c25
parent10e77e325c949baab49a8c5c992569d2cbb1f7a0 (diff)
downloadgcc-7e813472a20d496c4dafb20a704932656bfc8366.zip
gcc-7e813472a20d496c4dafb20a704932656bfc8366.tar.gz
gcc-7e813472a20d496c4dafb20a704932656bfc8366.tar.bz2
compiler: Don't allow tuple assignments to contain duplicate symbols.
Fixes issue 8436. From-SVN: r216420
-rw-r--r--gcc/go/gofrontend/parse.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/go/gofrontend/parse.cc b/gcc/go/gofrontend/parse.cc
index b97ada1..c4bcf05 100644
--- a/gcc/go/gofrontend/parse.cc
+++ b/gcc/go/gofrontend/parse.cc
@@ -2088,6 +2088,9 @@ Parse::simple_var_decl_or_assignment(const std::string& name,
Typed_identifier_list til;
til.push_back(Typed_identifier(name, NULL, location));
+ std::set<std::string> uniq_idents;
+ uniq_idents.insert(name);
+
// We've seen one identifier. If we see a comma now, this could be
// "a, *p = 1, 2".
if (this->peek_token()->is_op(OPERATOR_COMMA))
@@ -2102,6 +2105,7 @@ Parse::simple_var_decl_or_assignment(const std::string& name,
std::string id = token->identifier();
bool is_id_exported = token->is_identifier_exported();
Location id_location = token->location();
+ std::pair<std::set<std::string>::iterator, bool> ins;
token = this->advance_token();
if (!token->is_op(OPERATOR_COMMA))
@@ -2109,6 +2113,10 @@ Parse::simple_var_decl_or_assignment(const std::string& name,
if (token->is_op(OPERATOR_COLONEQ))
{
id = this->gogo_->pack_hidden_name(id, is_id_exported);
+ ins = uniq_idents.insert(id);
+ if (!ins.second && !Gogo::is_sink_name(id))
+ error_at(id_location, "multiple assignments to %s",
+ Gogo::message_name(id).c_str());
til.push_back(Typed_identifier(id, NULL, location));
}
else
@@ -2119,6 +2127,10 @@ Parse::simple_var_decl_or_assignment(const std::string& name,
}
id = this->gogo_->pack_hidden_name(id, is_id_exported);
+ ins = uniq_idents.insert(id);
+ if (!ins.second && !Gogo::is_sink_name(id))
+ error_at(id_location, "multiple assignments to %s",
+ Gogo::message_name(id).c_str());
til.push_back(Typed_identifier(id, NULL, location));
}