// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// http://code.google.com/p/protobuf/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// Author: kenton@google.com (Kenton Varda)
//  Based on original Protocol Buffers design by
//  Sanjay Ghemawat, Jeff Dean, and others.
//
// This file tests that various identifiers work as field and type names even
// though the same identifiers are used internally by the C++ code generator.


// Some generic_services option(s) added automatically.
// See:  http://go/proto2-generic-services-default
option cc_generic_services = true;     // auto-added

// We don't put this in a package within proto2 because we need to make sure
// that the generated code doesn't depend on being in the proto2 namespace.
package protobuf_unittest;

// Test that fields can have names like "input" and "i" which are also used
// internally by the code generator for local variables.
message TestConflictingSymbolNames {
  message BuildDescriptors {}
  message TypeTraits {}

  optional int32 input = 1;
  optional int32 output = 2;
  optional string length = 3;
  repeated int32 i = 4;
  repeated string new_element = 5 [ctype=STRING_PIECE];
  optional int32 total_size = 6;
  optional int32 tag = 7;

  enum TestEnum { FOO = 1; }
  message Data1 { repeated int32 data = 1; }
  message Data2 { repeated TestEnum data = 1; }
  message Data3 { repeated string data = 1; }
  message Data4 { repeated Data4 data = 1; }
  message Data5 { repeated string data = 1 [ctype=STRING_PIECE]; }
  message Data6 { repeated string data = 1 [ctype=CORD]; }

  optional int32 source = 8;
  optional int32 value = 9;
  optional int32 file = 10;
  optional int32 from = 11;
  optional int32 handle_uninterpreted = 12;
  repeated int32 index = 13;
  optional int32 controller = 14;
  optional int32 already_here = 15;

  optional uint32 uint32 = 16;
  optional uint64 uint64 = 17;
  optional string string = 18;
  optional int32 memset = 19;
  optional int32 int32 = 20;
  optional int64 int64 = 21;

  optional uint32 cached_size = 22;
  optional uint32 extensions = 23;
  optional uint32 bit = 24;
  optional uint32 bits = 25;
  optional uint32 offsets = 26;
  optional uint32 reflection = 27;

  message Cord {}
  optional string some_cord = 28 [ctype=CORD];

  message StringPiece {}
  optional string some_string_piece = 29 [ctype=STRING_PIECE];

  // Some keywords.
  optional uint32 int = 30;
  optional uint32 friend = 31;

  // The generator used to #define a macro called "DO" inside the .cc file.
  message DO {}
  optional DO do = 32;

  // Some template parameter names for extensions.
  optional int32 field_type = 33;
  optional bool is_packed = 34;

  extensions 1000 to max;
}

message TestConflictingSymbolNamesExtension {
  extend TestConflictingSymbolNames {
    repeated int32 repeated_int32_ext = 20423638 [packed=true];
  }
}

message DummyMessage {}

service TestConflictingMethodNames {
  rpc Closure(DummyMessage) returns (DummyMessage);
}
