|  | @@ -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,
 |