From 3a67c2f834119b8a1148ab071443c8d12ce207a1 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Sun, 3 Feb 2013 22:30:41 +0100 Subject: [PATCH] =?utf8?q?THRIFT-1603=20Thrift=20IDL=20allows=20for=20mult?= =?utf8?q?iple=20exceptions,=20args=20or=20struct=20member=20names=20to=20?= =?utf8?q?be=20the=20same=20Patch:=20Kamil=20Sa=C5=82a=C5=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- compiler/cpp/src/parse/t_struct.h | 7 +++++-- compiler/cpp/src/thrifty.yy | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler/cpp/src/parse/t_struct.h b/compiler/cpp/src/parse/t_struct.h index ffe2af38..1d035423 100644 --- a/compiler/cpp/src/parse/t_struct.h +++ b/compiler/cpp/src/parse/t_struct.h @@ -108,8 +108,6 @@ class t_struct : public t_type { } bool append(t_field* elem) { - members_.push_back(elem); - typedef members_type::iterator iter_type; std::pair bounds = std::equal_range( members_in_id_order_.begin(), members_in_id_order_.end(), elem, t_field::key_compare() @@ -117,6 +115,11 @@ class t_struct : public t_type { if (bounds.first != bounds.second) { return false; } + // returns false when there is a conflict of field names + if (get_field_by_name(elem->get_name()) != NULL) { + return false; + } + members_.push_back(elem); members_in_id_order_.insert(bounds.second, elem); validate_union_member( elem); return true; diff --git a/compiler/cpp/src/thrifty.yy b/compiler/cpp/src/thrifty.yy index 0a7f184e..2d90f21a 100644 --- a/compiler/cpp/src/thrifty.yy +++ b/compiler/cpp/src/thrifty.yy @@ -902,7 +902,7 @@ FieldList: pdebug("FieldList -> FieldList , Field"); $$ = $1; if (!($$->append($2))) { - yyerror("Field identifier %d for \"%s\" has already been used", $2->get_key(), $2->get_name().c_str()); + yyerror("\"%d: %s\" - field identifier/name has already been used", $2->get_key(), $2->get_name().c_str()); exit(1); } } -- 2.17.1