diff --git a/src/idl_parser.cpp b/src/idl_parser.cpp index 9911fab0c..4c60fd7d7 100644 --- a/src/idl_parser.cpp +++ b/src/idl_parser.cpp @@ -457,6 +457,10 @@ uoffset_t Parser::ParseTable(const StructDef &struct_def) { || struct_def.fields.vec[fieldn] != field)) { Error("struct field appearing out of order: " + name); } + for (auto it = field_stack_.rbegin(); + it != field_stack_.rbegin() + fieldn; ++it) { + if (it->second == field) Error("field already set: " + name); + } Expect(':'); Value val = field->value; ParseAnyValue(val, field); diff --git a/tests/test.cpp b/tests/test.cpp index 03955e331..4cd4fd1e5 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -490,6 +490,7 @@ void ErrorTest() { TestError("union Z { X } struct X { Y:int; }", "only tables"); TestError("table X { Y:[int]; YLength:int; }", "clash"); TestError("table X { Y:string = 1; }", "scalar"); + TestError("table X { Y:byte; } root_type X; { Y:1, Y:2 }", "already set"); } // Additional parser testing not covered elsewhere.