diff --git a/src/google/protobuf/compiler/parser.cc b/src/google/protobuf/compiler/parser.cc index 152f8f50132c..0576b64a4c97 100644 --- a/src/google/protobuf/compiler/parser.cc +++ b/src/google/protobuf/compiler/parser.cc @@ -902,10 +902,8 @@ bool Parser::ParseMessageField(FieldDescriptorProto* field, const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { { - LocationRecorder location(field_location, - FieldDescriptorProto::kLabelFieldNumber); FieldDescriptorProto::Label label; - if (ParseLabel(&label, containing_file)) { + if (ParseLabel(&label, field_location, containing_file)) { field->set_label(label); if (label == FieldDescriptorProto::LABEL_OPTIONAL && syntax_identifier_ == "proto3") { @@ -2206,18 +2204,22 @@ bool Parser::ParseMethodOptions(const LocationRecorder& parent_location, // ------------------------------------------------------------------- bool Parser::ParseLabel(FieldDescriptorProto::Label* label, + const LocationRecorder& field_location, const FileDescriptorProto* containing_file) { + if (!LookingAt("optional") && !LookingAt("repeated") && !LookingAt("required")) { + return false; + } + LocationRecorder location(field_location, + FieldDescriptorProto::kLabelFieldNumber); if (TryConsume("optional")) { *label = FieldDescriptorProto::LABEL_OPTIONAL; - return true; } else if (TryConsume("repeated")) { *label = FieldDescriptorProto::LABEL_REPEATED; - return true; - } else if (TryConsume("required")) { + } else { + Consume("required"); *label = FieldDescriptorProto::LABEL_REQUIRED; - return true; } - return false; + return true; } bool Parser::ParseType(FieldDescriptorProto::Type* type, diff --git a/src/google/protobuf/compiler/parser.h b/src/google/protobuf/compiler/parser.h index 9e2dc5f53204..45d433dc2b31 100644 --- a/src/google/protobuf/compiler/parser.h +++ b/src/google/protobuf/compiler/parser.h @@ -440,6 +440,7 @@ class PROTOBUF_EXPORT Parser { // Parse "required", "optional", or "repeated" and fill in "label" // with the value. Returns true if such a label is consumed. bool ParseLabel(FieldDescriptorProto::Label* label, + const LocationRecorder& field_location, const FileDescriptorProto* containing_file); // Parse a type name and fill in "type" (if it is a primitive) or