cmd/protoc-gen-go: generate def= protobuf field tag, default constants

Change-Id: Id5cc34f0c1a5eb72f19e648844a5480827bcbda3
Reviewed-on: https://go-review.googlesource.com/135256
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/cmd/protoc-gen-go/main.go b/cmd/protoc-gen-go/main.go
index 9213ea8..b90b43c 100644
--- a/cmd/protoc-gen-go/main.go
+++ b/cmd/protoc-gen-go/main.go
@@ -13,6 +13,7 @@
 	"encoding/hex"
 	"flag"
 	"fmt"
+	"math"
 	"strconv"
 	"strings"
 
@@ -321,6 +322,59 @@
 	})
 	g.P()
 
+	// Constants and vars holding the default values of fields.
+	for _, field := range message.Fields {
+		if !field.Desc.HasDefault() {
+			continue
+		}
+		defVarName := "Default_" + message.GoIdent.GoName + "_" + field.GoIdent.GoName
+		def := field.Desc.Default()
+		switch field.Desc.Kind() {
+		case protoreflect.StringKind:
+			g.P("const ", defVarName, " string = ", strconv.Quote(def.String()))
+		case protoreflect.BytesKind:
+			g.P("var ", defVarName, " []byte = []byte(", strconv.Quote(string(def.Bytes())), ")")
+		case protoreflect.EnumKind:
+			enum := field.EnumType
+			evalue := enum.Values[enum.Desc.Values().ByNumber(def.Enum()).Index()]
+			g.P("const ", defVarName, " ", field.EnumType.GoIdent, " = ", evalue.GoIdent)
+		case protoreflect.FloatKind, protoreflect.DoubleKind:
+			// Floating point numbers need extra handling for -Inf/Inf/NaN.
+			f := field.Desc.Default().Float()
+			goType := "float64"
+			if field.Desc.Kind() == protoreflect.FloatKind {
+				goType = "float32"
+			}
+			// funcCall returns a call to a function in the math package,
+			// possibly converting the result to float32.
+			funcCall := func(fn, param string) string {
+				s := g.QualifiedGoIdent(protogen.GoIdent{
+					GoImportPath: "math",
+					GoName:       fn,
+				}) + param
+				if goType != "float64" {
+					s = goType + "(" + s + ")"
+				}
+				return s
+			}
+			switch {
+			case math.IsInf(f, -1):
+				g.P("var ", defVarName, " ", goType, " = ", funcCall("Inf", "(-1)"))
+			case math.IsInf(f, 1):
+				g.P("var ", defVarName, " ", goType, " = ", funcCall("Inf", "(1)"))
+			case math.IsNaN(f):
+				g.P("var ", defVarName, " ", goType, " = ", funcCall("NaN", "()"))
+			default:
+				g.P("const ", defVarName, " ", goType, " = ", f)
+			}
+		default:
+			goType := fieldGoType(g, field)
+			goType = strings.TrimPrefix(goType, "*")
+			g.P("const ", defVarName, " ", goType, " = ", def.Interface())
+		}
+	}
+	g.P()
+
 	// TODO: getters
 
 	for _, nested := range message.Messages {
@@ -390,7 +444,6 @@
 	case protoreflect.Repeated:
 		tag = append(tag, "rep")
 	}
-	// TODO: default values
 	// TODO: packed
 	// name
 	name := string(field.Desc.Name())
@@ -417,6 +470,36 @@
 	if field.Desc.OneofType() != nil {
 		tag = append(tag, "oneof")
 	}
+	// default value
+	// This must appear last in the tag, since commas in strings aren't escaped.
+	if field.Desc.HasDefault() {
+		var def string
+		switch field.Desc.Kind() {
+		case protoreflect.BoolKind:
+			if field.Desc.Default().Bool() {
+				def = "1"
+			} else {
+				def = "0"
+			}
+		case protoreflect.BytesKind:
+			def = string(field.Desc.Default().Bytes())
+		case protoreflect.FloatKind, protoreflect.DoubleKind:
+			f := field.Desc.Default().Float()
+			switch {
+			case math.IsInf(f, -1):
+				def = "-inf"
+			case math.IsInf(f, 1):
+				def = "inf"
+			case math.IsNaN(f):
+				def = "nan"
+			default:
+				def = fmt.Sprint(f)
+			}
+		default:
+			def = fmt.Sprint(field.Desc.Default().Interface())
+		}
+		tag = append(tag, "def="+def)
+	}
 	return strings.Join(tag, ",")
 }
 
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
index f3302a5..5100c7a 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.pb.go
@@ -3,7 +3,10 @@
 
 package proto2
 
-import proto "github.com/golang/protobuf/proto"
+import (
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
 
 // This is a compile-time assertion to ensure that this generated file
 // is compatible with the proto package it is being compiled against.
@@ -15,14 +18,17 @@
 
 const (
 	FieldTestMessage_ZERO FieldTestMessage_Enum = 0
+	FieldTestMessage_ONE  FieldTestMessage_Enum = 1
 )
 
 var FieldTestMessage_Enum_name = map[int32]string{
 	0: "ZERO",
+	1: "ONE",
 }
 
 var FieldTestMessage_Enum_value = map[string]int32{
 	"ZERO": 0,
+	"ONE":  1,
 }
 
 func (x FieldTestMessage_Enum) Enum() *FieldTestMessage_Enum {
@@ -49,7 +55,7 @@
 }
 
 type FieldTestMessage struct {
-	OptionalBool         *string                           `protobuf:"bytes,1,opt,name=optional_bool,json=optionalBool" json:"optional_bool,omitempty"`
+	OptionalBool         *bool                             `protobuf:"varint,1,opt,name=optional_bool,json=optionalBool" json:"optional_bool,omitempty"`
 	OptionalEnum         *FieldTestMessage_Enum            `protobuf:"varint,2,opt,name=optional_enum,json=optionalEnum,enum=goproto.protoc.proto2.FieldTestMessage_Enum" json:"optional_enum,omitempty"`
 	OptionalInt32        *int32                            `protobuf:"varint,3,opt,name=optional_int32,json=optionalInt32" json:"optional_int32,omitempty"`
 	OptionalSint32       *int32                            `protobuf:"zigzag32,4,opt,name=optional_sint32,json=optionalSint32" json:"optional_sint32,omitempty"`
@@ -67,7 +73,7 @@
 	OptionalBytes        []byte                            `protobuf:"bytes,16,opt,name=optional_bytes,json=optionalBytes" json:"optional_bytes,omitempty"`
 	Optional_Message     *FieldTestMessage_Message         `protobuf:"bytes,17,opt,name=optional_Message,json=optionalMessage" json:"optional_Message,omitempty"`
 	Optionalgroup        *FieldTestMessage_OptionalGroup   `protobuf:"group,18,opt,name=OptionalGroup,json=optionalgroup" json:"optionalgroup,omitempty"`
-	RequiredBool         *string                           `protobuf:"bytes,101,req,name=required_bool,json=requiredBool" json:"required_bool,omitempty"`
+	RequiredBool         *bool                             `protobuf:"varint,101,req,name=required_bool,json=requiredBool" json:"required_bool,omitempty"`
 	RequiredEnum         *FieldTestMessage_Enum            `protobuf:"varint,102,req,name=required_enum,json=requiredEnum,enum=goproto.protoc.proto2.FieldTestMessage_Enum" json:"required_enum,omitempty"`
 	RequiredInt32        *int32                            `protobuf:"varint,103,req,name=required_int32,json=requiredInt32" json:"required_int32,omitempty"`
 	RequiredSint32       *int32                            `protobuf:"zigzag32,104,req,name=required_sint32,json=requiredSint32" json:"required_sint32,omitempty"`
@@ -85,7 +91,7 @@
 	RequiredBytes        []byte                            `protobuf:"bytes,116,req,name=required_bytes,json=requiredBytes" json:"required_bytes,omitempty"`
 	Required_Message     *FieldTestMessage_Message         `protobuf:"bytes,117,req,name=required_Message,json=requiredMessage" json:"required_Message,omitempty"`
 	Requiredgroup        *FieldTestMessage_RequiredGroup   `protobuf:"group,118,req,name=RequiredGroup,json=requiredgroup" json:"requiredgroup,omitempty"`
-	RepeatedBool         []string                          `protobuf:"bytes,201,rep,name=repeated_bool,json=repeatedBool" json:"repeated_bool,omitempty"`
+	RepeatedBool         []bool                            `protobuf:"varint,201,rep,name=repeated_bool,json=repeatedBool" json:"repeated_bool,omitempty"`
 	RepeatedEnum         []FieldTestMessage_Enum           `protobuf:"varint,202,rep,name=repeated_enum,json=repeatedEnum,enum=goproto.protoc.proto2.FieldTestMessage_Enum" json:"repeated_enum,omitempty"`
 	RepeatedInt32        []int32                           `protobuf:"varint,203,rep,name=repeated_int32,json=repeatedInt32" json:"repeated_int32,omitempty"`
 	RepeatedSint32       []int32                           `protobuf:"zigzag32,204,rep,name=repeated_sint32,json=repeatedSint32" json:"repeated_sint32,omitempty"`
@@ -103,6 +109,28 @@
 	RepeatedBytes        [][]byte                          `protobuf:"bytes,216,rep,name=repeated_bytes,json=repeatedBytes" json:"repeated_bytes,omitempty"`
 	Repeated_Message     []*FieldTestMessage_Message       `protobuf:"bytes,217,rep,name=repeated_Message,json=repeatedMessage" json:"repeated_Message,omitempty"`
 	Repeatedgroup        []*FieldTestMessage_RepeatedGroup `protobuf:"group,218,rep,name=RepeatedGroup,json=repeatedgroup" json:"repeatedgroup,omitempty"`
+	DefaultBool          *bool                             `protobuf:"varint,301,opt,name=default_bool,json=defaultBool,def=1" json:"default_bool,omitempty"`
+	DefaultEnum          *FieldTestMessage_Enum            `protobuf:"varint,302,opt,name=default_enum,json=defaultEnum,enum=goproto.protoc.proto2.FieldTestMessage_Enum,def=1" json:"default_enum,omitempty"`
+	DefaultInt32         *int32                            `protobuf:"varint,303,opt,name=default_int32,json=defaultInt32,def=1" json:"default_int32,omitempty"`
+	DefaultSint32        *int32                            `protobuf:"zigzag32,304,opt,name=default_sint32,json=defaultSint32,def=1" json:"default_sint32,omitempty"`
+	DefaultUint32        *uint32                           `protobuf:"varint,305,opt,name=default_uint32,json=defaultUint32,def=1" json:"default_uint32,omitempty"`
+	DefaultInt64         *int64                            `protobuf:"varint,306,opt,name=default_int64,json=defaultInt64,def=1" json:"default_int64,omitempty"`
+	DefaultSint64        *int64                            `protobuf:"zigzag64,307,opt,name=default_sint64,json=defaultSint64,def=1" json:"default_sint64,omitempty"`
+	DefaultUint64        *uint64                           `protobuf:"varint,308,opt,name=default_uint64,json=defaultUint64,def=1" json:"default_uint64,omitempty"`
+	DefaultSfixed32      *int32                            `protobuf:"fixed32,309,opt,name=default_sfixed32,json=defaultSfixed32,def=1" json:"default_sfixed32,omitempty"`
+	DefaultFixed32       *uint32                           `protobuf:"fixed32,310,opt,name=default_fixed32,json=defaultFixed32,def=1" json:"default_fixed32,omitempty"`
+	DefaultFloat         *float32                          `protobuf:"fixed32,311,opt,name=default_float,json=defaultFloat,def=1.5" json:"default_float,omitempty"`
+	DefaultSfixed64      *int64                            `protobuf:"fixed64,312,opt,name=default_sfixed64,json=defaultSfixed64,def=1" json:"default_sfixed64,omitempty"`
+	DefaultFixed64       *uint64                           `protobuf:"fixed64,313,opt,name=default_fixed64,json=defaultFixed64,def=1" json:"default_fixed64,omitempty"`
+	DefaultDouble        *float64                          `protobuf:"fixed64,314,opt,name=default_double,json=defaultDouble,def=1.5" json:"default_double,omitempty"`
+	DefaultString        *string                           `protobuf:"bytes,315,opt,name=default_string,json=defaultString,def=x,y" json:"default_string,omitempty"`
+	DefaultBytes         []byte                            `protobuf:"bytes,316,opt,name=default_bytes,json=defaultBytes,def=x,y" json:"default_bytes,omitempty"`
+	DefaultFloatNeginf   *float32                          `protobuf:"fixed32,400,opt,name=default_float_neginf,json=defaultFloatNeginf,def=-inf" json:"default_float_neginf,omitempty"`
+	DefaultFloatPosinf   *float32                          `protobuf:"fixed32,401,opt,name=default_float_posinf,json=defaultFloatPosinf,def=inf" json:"default_float_posinf,omitempty"`
+	DefaultFloatNan      *float32                          `protobuf:"fixed32,402,opt,name=default_float_nan,json=defaultFloatNan,def=nan" json:"default_float_nan,omitempty"`
+	DefaultDoubleNeginf  *float64                          `protobuf:"fixed64,403,opt,name=default_double_neginf,json=defaultDoubleNeginf,def=-inf" json:"default_double_neginf,omitempty"`
+	DefaultDoublePosinf  *float64                          `protobuf:"fixed64,404,opt,name=default_double_posinf,json=defaultDoublePosinf,def=inf" json:"default_double_posinf,omitempty"`
+	DefaultDoubleNan     *float64                          `protobuf:"fixed64,405,opt,name=default_double_nan,json=defaultDoubleNan,def=nan" json:"default_double_nan,omitempty"`
 	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
 	XXX_unrecognized     []byte                            `json:"-"`
 	XXX_sizecache        int32                             `json:"-"`
@@ -132,6 +160,30 @@
 
 var xxx_messageInfo_FieldTestMessage proto.InternalMessageInfo
 
+const Default_FieldTestMessage_DefaultBool bool = true
+const Default_FieldTestMessage_DefaultEnum FieldTestMessage_Enum = FieldTestMessage_ONE
+const Default_FieldTestMessage_DefaultInt32 int32 = 1
+const Default_FieldTestMessage_DefaultSint32 int32 = 1
+const Default_FieldTestMessage_DefaultUint32 uint32 = 1
+const Default_FieldTestMessage_DefaultInt64 int64 = 1
+const Default_FieldTestMessage_DefaultSint64 int64 = 1
+const Default_FieldTestMessage_DefaultUint64 uint64 = 1
+const Default_FieldTestMessage_DefaultSfixed32 int32 = 1
+const Default_FieldTestMessage_DefaultFixed32 uint32 = 1
+const Default_FieldTestMessage_DefaultFloat float32 = 1.5
+const Default_FieldTestMessage_DefaultSfixed64 int64 = 1
+const Default_FieldTestMessage_DefaultFixed64 uint64 = 1
+const Default_FieldTestMessage_DefaultDouble float64 = 1.5
+const Default_FieldTestMessage_DefaultString string = "x,y"
+
+var Default_FieldTestMessage_DefaultBytes []byte = []byte("x,y")
+var Default_FieldTestMessage_DefaultFloatNeginf float32 = float32(math.Inf(-1))
+var Default_FieldTestMessage_DefaultFloatPosinf float32 = float32(math.Inf(1))
+var Default_FieldTestMessage_DefaultFloatNan float32 = float32(math.NaN())
+var Default_FieldTestMessage_DefaultDoubleNeginf float64 = math.Inf(-1)
+var Default_FieldTestMessage_DefaultDoublePosinf float64 = math.Inf(1)
+var Default_FieldTestMessage_DefaultDoubleNan float64 = math.NaN()
+
 type FieldTestMessage_OptionalGroup struct {
 	OptionalGroup        *string  `protobuf:"bytes,19,opt,name=optional_group,json=optionalGroup" json:"optional_group,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -262,66 +314,89 @@
 func init() { proto.RegisterFile("proto2/fields.proto", fileDescriptor_fd8a9d72b841fd68) }
 
 var fileDescriptor_fd8a9d72b841fd68 = []byte{
-	// 969 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x96, 0xdb, 0x6f, 0x1b, 0x45,
-	0x14, 0xc6, 0x99, 0x89, 0x9b, 0x34, 0xdb, 0x38, 0x71, 0xb6, 0x02, 0x8d, 0x78, 0x3a, 0x2a, 0xb7,
-	0x01, 0x5a, 0x5b, 0x72, 0x87, 0x41, 0x88, 0xb7, 0x88, 0xa6, 0xe2, 0x01, 0x55, 0x2c, 0xf0, 0x92,
-	0x22, 0x55, 0x4e, 0xbc, 0x59, 0x0c, 0x1b, 0x8f, 0x6b, 0xaf, 0xb9, 0xfc, 0x7d, 0x3c, 0x71, 0xbf,
-	0xdf, 0xff, 0x19, 0x74, 0xe6, 0xcc, 0x65, 0x67, 0xdd, 0x87, 0x26, 0x4f, 0xb6, 0x4f, 0xbe, 0xf3,
-	0x7d, 0x73, 0xc6, 0xe7, 0xe7, 0x4d, 0x76, 0x73, 0xb1, 0x34, 0x8d, 0x19, 0x8f, 0xce, 0x67, 0x65,
-	0x3d, 0x5d, 0x0d, 0xed, 0xa7, 0xfc, 0xd9, 0xca, 0xd8, 0x37, 0xf4, 0xf1, 0x8c, 0x5e, 0xc6, 0xb7,
-	0xbe, 0x7e, 0x2e, 0x1b, 0x1c, 0xa3, 0xee, 0xc3, 0x72, 0xd5, 0xbc, 0x57, 0xae, 0x56, 0x93, 0xaa,
-	0xcc, 0x5f, 0xc8, 0xfa, 0x66, 0xd1, 0xcc, 0xcc, 0x7c, 0x52, 0x3f, 0x3a, 0x35, 0xa6, 0x16, 0x0c,
-	0x98, 0xdc, 0x2d, 0xf6, 0x7c, 0xf1, 0xc8, 0x98, 0x3a, 0x7f, 0xbf, 0x25, 0x2a, 0xe7, 0xeb, 0x0b,
-	0xc1, 0x81, 0xc9, 0xfd, 0xf1, 0xed, 0xe1, 0x13, 0x83, 0x86, 0xdd, 0x90, 0xe1, 0xbd, 0xf9, 0xfa,
-	0x22, 0x5a, 0xe2, 0xa7, 0xfc, 0xa5, 0x6c, 0x3f, 0x58, 0xce, 0xe6, 0xcd, 0xdd, 0xb1, 0xd8, 0x02,
-	0x26, 0xaf, 0x15, 0x21, 0xe8, 0x5d, 0x2c, 0xe6, 0xaf, 0x64, 0x07, 0x41, 0xb6, 0x22, 0x5d, 0x0f,
-	0x98, 0x3c, 0x2c, 0x42, 0xf7, 0x07, 0xb3, 0x0d, 0xe1, 0x9a, 0x84, 0xd7, 0x80, 0xc9, 0x7e, 0x14,
-	0x7e, 0x44, 0xc2, 0x4e, 0xb0, 0x56, 0x62, 0x1b, 0x98, 0xdc, 0x4a, 0x82, 0xb5, 0xda, 0x08, 0xd6,
-	0x4a, 0xec, 0x00, 0x93, 0x79, 0x1a, 0xdc, 0x11, 0xae, 0x49, 0x78, 0x1d, 0x98, 0xec, 0xa5, 0xc1,
-	0x5a, 0xe5, 0xaf, 0x67, 0x87, 0xd1, 0xf1, 0x7c, 0xf6, 0x65, 0x39, 0xbd, 0x3b, 0x16, 0xbb, 0xc0,
-	0xe4, 0x41, 0x31, 0x08, 0x9e, 0xae, 0x9e, 0xbf, 0x9a, 0x85, 0xda, 0x23, 0xaf, 0xcd, 0x80, 0xc9,
-	0x9d, 0x22, 0xa4, 0x1d, 0x3b, 0x69, 0x7b, 0xa0, 0xf3, 0xda, 0x4c, 0x1a, 0x71, 0x03, 0x98, 0xe4,
-	0x71, 0xa0, 0x63, 0x2c, 0x3e, 0x21, 0x5e, 0x2b, 0xb1, 0x07, 0x4c, 0x0e, 0xba, 0xf1, 0x5a, 0x6d,
-	0xc6, 0x6b, 0x25, 0xfa, 0xc0, 0xe4, 0x76, 0x27, 0xbe, 0x33, 0xff, 0xd4, 0xac, 0x4f, 0xeb, 0x52,
-	0xec, 0x03, 0x93, 0x2c, 0xce, 0xff, 0x8e, 0xad, 0xa6, 0x37, 0xda, 0x2c, 0x67, 0xf3, 0x4a, 0x1c,
-	0xd8, 0x5d, 0x8b, 0x37, 0x6a, 0xab, 0xc9, 0x40, 0xa7, 0x5f, 0x35, 0xe5, 0x4a, 0x0c, 0x80, 0xc9,
-	0xbd, 0x38, 0xd0, 0x11, 0x16, 0xf3, 0x93, 0xd6, 0x19, 0xdd, 0xa2, 0x89, 0x43, 0x60, 0xf2, 0xc6,
-	0x78, 0xf4, 0xb4, 0x7b, 0xe9, 0x5e, 0xe3, 0x50, 0x9e, 0x8a, 0x87, 0x71, 0xe1, 0xab, 0xa5, 0x59,
-	0x2f, 0x44, 0x0e, 0x4c, 0x66, 0xe3, 0x37, 0x9e, 0xd6, 0xf8, 0x81, 0x6b, 0xbe, 0x8f, 0xcd, 0x45,
-	0xea, 0x85, 0xc8, 0x2d, 0xcb, 0xc7, 0xeb, 0xd9, 0xb2, 0x9c, 0x12, 0x72, 0x25, 0x70, 0x44, 0xce,
-	0x17, 0x3d, 0x72, 0x41, 0x64, 0x91, 0x3b, 0x07, 0x7e, 0x79, 0xe4, 0xbc, 0x85, 0x47, 0x2e, 0x58,
-	0x12, 0x21, 0x15, 0x70, 0x44, 0xce, 0x57, 0x03, 0x72, 0x41, 0xe6, 0x90, 0xfb, 0x04, 0x38, 0x22,
-	0xe7, 0xcb, 0x11, 0xb9, 0x20, 0x74, 0xc8, 0xcd, 0x80, 0x23, 0x72, 0xbe, 0x1c, 0x91, 0x6b, 0x07,
-	0x6b, 0x25, 0x3e, 0x05, 0x8e, 0xc8, 0xb5, 0x82, 0x69, 0x93, 0x92, 0x60, 0xad, 0xc4, 0x67, 0xc0,
-	0x11, 0xb9, 0x76, 0x70, 0x47, 0xe8, 0x90, 0xab, 0x81, 0x23, 0x72, 0xed, 0x60, 0x42, 0x2e, 0x3a,
-	0x7a, 0x8c, 0x2e, 0x80, 0x23, 0x72, 0xc1, 0xb3, 0x85, 0x5c, 0x10, 0x7b, 0xed, 0x1c, 0x38, 0x22,
-	0xe7, 0xeb, 0x2d, 0xe4, 0xa2, 0xd4, 0x22, 0x67, 0x80, 0x23, 0x72, 0x41, 0xe8, 0x91, 0xeb, 0xc4,
-	0x6b, 0x25, 0x16, 0xc0, 0x11, 0xb9, 0x34, 0x9e, 0x90, 0x4b, 0xe3, 0xb5, 0x12, 0x8f, 0x81, 0x23,
-	0x72, 0x49, 0x7c, 0x67, 0x7e, 0x87, 0xdc, 0x12, 0x38, 0x22, 0xe7, 0xcb, 0x11, 0xb9, 0x78, 0x00,
-	0x42, 0x6e, 0x65, 0x77, 0x2d, 0xde, 0x68, 0x40, 0x2e, 0xae, 0xa4, 0x45, 0xae, 0x01, 0x8e, 0xc8,
-	0x85, 0x9d, 0xf4, 0xc8, 0x05, 0x99, 0x47, 0x6e, 0x0d, 0xfc, 0x4a, 0xc8, 0x79, 0xa3, 0x16, 0x72,
-	0xbe, 0x44, 0xc8, 0x7d, 0x0e, 0xfc, 0x32, 0xc8, 0x15, 0xae, 0xd9, 0x21, 0x97, 0x78, 0xe5, 0x2f,
-	0xa2, 0xf9, 0xa2, 0x9c, 0x34, 0x1e, 0xb9, 0x6f, 0x18, 0x6c, 0x11, 0x73, 0x54, 0xb5, 0xcc, 0x15,
-	0x2d, 0x95, 0x65, 0xee, 0x5b, 0x54, 0x5d, 0x01, 0x3a, 0xf2, 0xb0, 0xd0, 0xbd, 0x8c, 0x37, 0xeb,
-	0x3c, 0x89, 0x91, 0xef, 0xd0, 0xd4, 0x52, 0x47, 0x65, 0xa2, 0x4e, 0xe2, 0x57, 0xe5, 0x74, 0x8e,
-	0xba, 0xef, 0x51, 0x68, 0xb1, 0xa3, 0xba, 0xc3, 0xae, 0xad, 0x74, 0xd8, 0xfd, 0x80, 0xca, 0x7e,
-	0x54, 0x3a, 0xee, 0x3a, 0xd9, 0x5a, 0x89, 0x1f, 0x51, 0xb8, 0x95, 0x64, 0x6b, 0xb5, 0x91, 0xad,
-	0x95, 0xf8, 0x09, 0x85, 0x79, 0x9a, 0xdd, 0x51, 0x3a, 0xf2, 0x7e, 0x46, 0x65, 0x2f, 0xcd, 0xd6,
-	0x2a, 0xbf, 0x8d, 0xbb, 0xef, 0x3d, 0x3d, 0x4e, 0xbf, 0xa0, 0xd6, 0xb2, 0xe7, 0x5c, 0x3d, 0x7b,
-	0xaf, 0x65, 0xa1, 0x16, 0xd8, 0xfb, 0x15, 0xc5, 0x16, 0x3e, 0xfa, 0x83, 0x87, 0xaf, 0x3d, 0x15,
-	0xc1, 0xf7, 0x1b, 0x2a, 0x79, 0x9c, 0x8a, 0xe8, 0xdb, 0x3c, 0x81, 0x56, 0xe2, 0x77, 0x94, 0x0e,
-	0xba, 0x27, 0xd0, 0x6a, 0xf3, 0x04, 0x5a, 0x89, 0x3f, 0x50, 0xbc, 0xdd, 0x39, 0x41, 0xe7, 0x16,
-	0x1c, 0x7f, 0x7f, 0xa2, 0x94, 0xc5, 0x5b, 0x70, 0x00, 0x26, 0x37, 0x4b, 0x00, 0xfe, 0x45, 0x9b,
-	0x17, 0x6f, 0x96, 0x08, 0x6c, 0x4f, 0x45, 0x04, 0xfe, 0x8d, 0xc2, 0xbd, 0x38, 0x15, 0x21, 0xf8,
-	0xb0, 0x75, 0x4e, 0x8f, 0xe0, 0x3f, 0xa8, 0xbc, 0x1a, 0x83, 0xe4, 0xe4, 0x19, 0xfc, 0x38, 0x02,
-	0x40, 0x0c, 0xfe, 0x8b, 0xce, 0x97, 0x82, 0x90, 0xba, 0x03, 0x84, 0x2d, 0xb3, 0xe7, 0x75, 0xd6,
-	0x4f, 0x9e, 0x8b, 0xc9, 0x83, 0x9e, 0xf2, 0x6e, 0xda, 0x7f, 0x08, 0xc2, 0xf3, 0xf2, 0xbe, 0xef,
-	0x4b, 0xe0, 0x4e, 0x7e, 0xad, 0xa8, 0xef, 0x0b, 0xfb, 0xab, 0x16, 0xa0, 0xa7, 0xbe, 0x37, 0xb1,
-	0xaf, 0x75, 0x9e, 0xe4, 0x8e, 0xa9, 0xef, 0x3f, 0xfa, 0x32, 0xc2, 0x41, 0xa9, 0x71, 0x37, 0xdb,
-	0x71, 0x03, 0xdd, 0x1a, 0x64, 0x3d, 0x8b, 0xf1, 0xf5, 0xac, 0x77, 0x72, 0xaf, 0x78, 0x30, 0x78,
-	0xe6, 0xe8, 0xed, 0x93, 0xb7, 0x2a, 0x63, 0xaa, 0xba, 0x1c, 0x56, 0xa6, 0x9e, 0xcc, 0xab, 0xa1,
-	0x59, 0x56, 0x23, 0x7b, 0x1f, 0xa3, 0xb3, 0x8b, 0x29, 0xbd, 0x3b, 0xbb, 0x53, 0x95, 0xf3, 0x3b,
-	0x95, 0x19, 0x35, 0xe5, 0xaa, 0x99, 0x4e, 0x9a, 0x09, 0x95, 0xc7, 0xff, 0x07, 0x00, 0x00, 0xff,
-	0xff, 0xc9, 0x6e, 0x69, 0xe6, 0xaf, 0x0b, 0x00, 0x00,
+	// 1337 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x97, 0x59, 0x73, 0xdc, 0x44,
+	0x10, 0xc7, 0x19, 0x69, 0xe3, 0x63, 0xb2, 0x6b, 0xaf, 0x15, 0x52, 0x35, 0xf0, 0x40, 0x4d, 0x85,
+	0x23, 0x0a, 0x89, 0xd7, 0x64, 0xa3, 0x4c, 0x88, 0x79, 0x4b, 0x11, 0x53, 0x3c, 0x90, 0x80, 0x20,
+	0x2f, 0x0e, 0x55, 0x2e, 0xd9, 0xab, 0x15, 0x0b, 0x6b, 0x69, 0xb3, 0xab, 0x85, 0xe4, 0x5b, 0x70,
+	0x7e, 0x0c, 0xee, 0xfb, 0xf8, 0x02, 0xdc, 0xf7, 0xfd, 0x61, 0xa0, 0x7a, 0x7a, 0x66, 0x34, 0x23,
+	0xe5, 0x21, 0xf6, 0x93, 0xbd, 0xbd, 0xff, 0xee, 0x7f, 0x77, 0x5b, 0xbf, 0xd1, 0x98, 0x1e, 0x9b,
+	0x4c, 0x8b, 0xb2, 0xe8, 0x6f, 0x0c, 0x47, 0xe9, 0x78, 0x30, 0xeb, 0xc9, 0x4f, 0xc1, 0xf1, 0xac,
+	0x90, 0xbf, 0xe0, 0xc7, 0x3d, 0xfc, 0xd1, 0x3f, 0xf1, 0xdf, 0x7d, 0xb4, 0xbb, 0x05, 0xba, 0xe7,
+	0xd2, 0x59, 0xf9, 0x54, 0x3a, 0x9b, 0x25, 0x59, 0x1a, 0xdc, 0x4f, 0x3b, 0xc5, 0xa4, 0x1c, 0x15,
+	0x79, 0x32, 0xde, 0xd9, 0x2d, 0x8a, 0x31, 0x23, 0x9c, 0x84, 0x4b, 0x71, 0x5b, 0x07, 0x2f, 0x15,
+	0xc5, 0x38, 0x78, 0xc6, 0x12, 0xa5, 0xf9, 0x7c, 0x9f, 0x79, 0x9c, 0x84, 0x2b, 0xfd, 0x33, 0xbd,
+	0xdb, 0x1a, 0xf5, 0xea, 0x26, 0xbd, 0xcb, 0xf9, 0x7c, 0xbf, 0x2a, 0x09, 0x9f, 0x82, 0x07, 0xe9,
+	0x8a, 0x29, 0x39, 0xca, 0xcb, 0x73, 0x7d, 0xe6, 0x73, 0x12, 0x1e, 0x89, 0x8d, 0xd1, 0x93, 0x10,
+	0x0c, 0x4e, 0xd2, 0x55, 0x23, 0x9b, 0xa1, 0xae, 0xc5, 0x49, 0xb8, 0x16, 0x9b, 0xec, 0x67, 0x47,
+	0x0d, 0xe1, 0x1c, 0x85, 0x47, 0x38, 0x09, 0x3b, 0x95, 0xf0, 0x1a, 0x0a, 0x6b, 0xc6, 0x22, 0x62,
+	0x0b, 0x9c, 0x84, 0xbe, 0x63, 0x2c, 0xa2, 0x86, 0xb1, 0x88, 0xd8, 0x22, 0x27, 0x61, 0xe0, 0x1a,
+	0xd7, 0x84, 0x73, 0x14, 0x2e, 0x71, 0x12, 0xb6, 0x5c, 0x63, 0x11, 0x05, 0xa7, 0xe9, 0x5a, 0x55,
+	0x71, 0x38, 0xba, 0x99, 0x0e, 0xce, 0xf5, 0xd9, 0x32, 0x27, 0xe1, 0x6a, 0xdc, 0x35, 0x35, 0x55,
+	0x3c, 0x38, 0x45, 0x4d, 0x6c, 0x47, 0x6b, 0x29, 0x27, 0xe1, 0x62, 0x6c, 0xdc, 0xb6, 0x94, 0xd4,
+	0x1e, 0x68, 0x38, 0x2e, 0x92, 0x92, 0x1d, 0xe5, 0x24, 0xf4, 0xaa, 0x81, 0xb6, 0x20, 0x78, 0x1b,
+	0x7b, 0x11, 0xb1, 0x36, 0x27, 0x61, 0xb7, 0x6e, 0x2f, 0xa2, 0xa6, 0xbd, 0x88, 0x58, 0x87, 0x93,
+	0x70, 0xa1, 0x66, 0x5f, 0x9b, 0x7f, 0x50, 0xcc, 0x77, 0xc7, 0x29, 0x5b, 0xe1, 0x24, 0x24, 0xd5,
+	0xfc, 0x8f, 0xcb, 0xa8, 0xbb, 0xd1, 0x72, 0x3a, 0xca, 0x33, 0xb6, 0xca, 0x49, 0xb8, 0x6c, 0x6d,
+	0x54, 0x46, 0x9d, 0x81, 0x76, 0x6f, 0x95, 0xe9, 0x8c, 0x75, 0x39, 0x09, 0xdb, 0xd5, 0x40, 0x97,
+	0x20, 0x18, 0x6c, 0x5b, 0x3d, 0xaa, 0x07, 0x8d, 0xad, 0x71, 0x12, 0x1e, 0xed, 0x6f, 0xdc, 0xe9,
+	0x73, 0xa9, 0x7e, 0x56, 0x43, 0x69, 0x2a, 0xae, 0x57, 0x0f, 0x7c, 0x36, 0x2d, 0xe6, 0x13, 0x16,
+	0x70, 0x12, 0xd2, 0xfe, 0xf9, 0x3b, 0x2d, 0x7c, 0x55, 0x25, 0x3f, 0x01, 0xc9, 0xb1, 0x5b, 0x0b,
+	0x90, 0x9b, 0xa6, 0x37, 0xe6, 0xa3, 0x69, 0x3a, 0x40, 0xe4, 0x52, 0xee, 0x01, 0x72, 0x3a, 0xa8,
+	0x91, 0x33, 0x22, 0x89, 0xdc, 0x90, 0x7b, 0x07, 0x47, 0x4e, 0x97, 0xd0, 0xc8, 0x99, 0x92, 0x48,
+	0x48, 0xc6, 0x3d, 0x40, 0x4e, 0x47, 0x0d, 0x72, 0x46, 0xa6, 0x90, 0x7b, 0x81, 0x7b, 0x80, 0x9c,
+	0x0e, 0x57, 0xc8, 0x19, 0xa1, 0x42, 0x6e, 0xc4, 0x3d, 0x40, 0x4e, 0x87, 0x2b, 0xe4, 0x6c, 0x63,
+	0x11, 0xb1, 0x17, 0xb9, 0x07, 0xc8, 0x59, 0xc6, 0xf8, 0x24, 0x39, 0xc6, 0x22, 0x62, 0x2f, 0x71,
+	0x0f, 0x90, 0xb3, 0x8d, 0x6b, 0x42, 0x85, 0xdc, 0x98, 0x7b, 0x80, 0x9c, 0x6d, 0x8c, 0xc8, 0x55,
+	0x15, 0x35, 0x46, 0xfb, 0xdc, 0x03, 0xe4, 0x4c, 0x4d, 0x0b, 0x39, 0x23, 0xd6, 0xda, 0x9c, 0x7b,
+	0x80, 0x9c, 0x8e, 0x5b, 0xc8, 0x55, 0x52, 0x89, 0x5c, 0xc1, 0x3d, 0x40, 0xce, 0x08, 0x35, 0x72,
+	0x35, 0x7b, 0x11, 0xb1, 0x09, 0xf7, 0x00, 0x39, 0xd7, 0x1e, 0x91, 0x73, 0xed, 0x45, 0xc4, 0x6e,
+	0x70, 0x0f, 0x90, 0x73, 0xec, 0x6b, 0xf3, 0x2b, 0xe4, 0xa6, 0xdc, 0x03, 0xe4, 0x74, 0xb8, 0x42,
+	0xae, 0x6a, 0x00, 0x91, 0x9b, 0x71, 0x0f, 0x90, 0x33, 0xf6, 0x06, 0xb9, 0xea, 0x91, 0x94, 0xc8,
+	0x95, 0xdc, 0x03, 0xe4, 0xcc, 0x33, 0xa9, 0x91, 0x33, 0x32, 0x8d, 0xdc, 0x9c, 0x7b, 0x87, 0x42,
+	0x4e, 0x17, 0xb2, 0x90, 0xd3, 0x21, 0x44, 0xee, 0x65, 0xee, 0x1d, 0x04, 0xb9, 0x58, 0x25, 0x2b,
+	0xe4, 0x9c, 0x5a, 0xc1, 0x03, 0x50, 0x7c, 0x92, 0x26, 0xa5, 0x46, 0xee, 0x6b, 0xc2, 0x7d, 0x64,
+	0x0e, 0xa3, 0x92, 0xb9, 0xd8, 0x52, 0x49, 0xe6, 0xbe, 0x01, 0xd5, 0x21, 0xa0, 0xc3, 0x1a, 0x12,
+	0xba, 0x87, 0x60, 0xb3, 0xaa, 0x26, 0x32, 0xf2, 0x2d, 0x14, 0x95, 0xd4, 0x61, 0x18, 0xa9, 0x0b,
+	0xe1, 0x4f, 0xa5, 0x74, 0x8a, 0xba, 0xef, 0x40, 0x28, 0xb1, 0xc3, 0xb8, 0xc2, 0xce, 0x56, 0x2a,
+	0xec, 0xbe, 0x07, 0x65, 0xa7, 0x52, 0x2a, 0xee, 0x6a, 0xde, 0x22, 0x62, 0x3f, 0x80, 0xd0, 0x77,
+	0xbc, 0x45, 0xd4, 0xf0, 0x16, 0x11, 0xfb, 0x11, 0x84, 0x81, 0xeb, 0x5d, 0x53, 0x2a, 0xf2, 0x7e,
+	0x02, 0x65, 0xcb, 0xf5, 0x16, 0x51, 0x70, 0x06, 0x9e, 0x7d, 0x5d, 0x53, 0xe3, 0xf4, 0x33, 0x68,
+	0x25, 0x7b, 0xaa, 0xaa, 0x66, 0xef, 0x61, 0x6a, 0x62, 0x86, 0xbd, 0x5f, 0x40, 0x2c, 0xe1, 0xc3,
+	0x2f, 0x34, 0x7c, 0xf6, 0x54, 0x08, 0xdf, 0xaf, 0xa0, 0xf4, 0xaa, 0xa9, 0x90, 0xbe, 0x66, 0x07,
+	0x22, 0x62, 0xbf, 0x81, 0xb4, 0x5b, 0xef, 0x40, 0x44, 0xcd, 0x0e, 0x44, 0xc4, 0x7e, 0x07, 0xf1,
+	0x42, 0xad, 0x83, 0xda, 0x16, 0x14, 0x7f, 0x7f, 0x80, 0x94, 0x54, 0x5b, 0x50, 0x00, 0x3a, 0x9b,
+	0x45, 0x00, 0xff, 0x04, 0xe5, 0xb2, 0xb5, 0x59, 0x24, 0xd0, 0x9e, 0x0a, 0x09, 0xfc, 0x0b, 0x84,
+	0xed, 0x6a, 0x2a, 0x44, 0xf0, 0xba, 0xd5, 0xa7, 0x46, 0xf0, 0x6f, 0x50, 0x1e, 0x8e, 0x41, 0xac,
+	0xa4, 0x19, 0x7c, 0xbe, 0x02, 0x00, 0x19, 0xfc, 0x07, 0x2a, 0x1f, 0x08, 0x42, 0xcc, 0x36, 0x10,
+	0x5a, 0xc5, 0x82, 0x90, 0xb6, 0x07, 0xe9, 0x30, 0x99, 0x8f, 0x4b, 0x64, 0xf0, 0x6d, 0xb8, 0x45,
+	0x2e, 0x6d, 0xb6, 0xca, 0xe9, 0x3c, 0x8d, 0x8f, 0xaa, 0xaf, 0x24, 0x88, 0xd7, 0x2a, 0xa5, 0xe4,
+	0xf0, 0x9d, 0x43, 0xdc, 0x37, 0x37, 0xfd, 0xab, 0x57, 0x2e, 0x9b, 0xb2, 0x92, 0xc5, 0x93, 0xb4,
+	0xa3, 0xcb, 0x22, 0x37, 0xef, 0x42, 0xdd, 0x23, 0x9b, 0xe4, 0x6c, 0xac, 0xfd, 0x10, 0xc6, 0x53,
+	0x74, 0x45, 0x0b, 0x15, 0x8b, 0xef, 0x81, 0x72, 0x0d, 0x94, 0xba, 0x84, 0xa2, 0xd1, 0x92, 0x2a,
+	0x18, 0xdf, 0x07, 0x69, 0xc7, 0x96, 0x5e, 0xd3, 0xef, 0x4b, 0xdb, 0x5e, 0x44, 0xec, 0x03, 0x50,
+	0xfa, 0x35, 0x7b, 0xf9, 0x2a, 0x70, 0xec, 0x45, 0xc4, 0x3e, 0x04, 0x65, 0x50, 0xb7, 0x77, 0xa5,
+	0x8a, 0xc7, 0x8f, 0x40, 0xda, 0xaa, 0xdb, 0x8b, 0x28, 0x58, 0xa7, 0x5d, 0x53, 0x55, 0x33, 0xf6,
+	0x31, 0x88, 0x57, 0x41, 0xbc, 0xaa, 0xeb, 0x6a, 0x24, 0x4f, 0x53, 0x1d, 0x32, 0x44, 0x7e, 0x02,
+	0xea, 0x45, 0x50, 0x6b, 0xd3, 0x2d, 0xf3, 0xee, 0x34, 0xa3, 0x21, 0x92, 0x9f, 0x82, 0xd4, 0xdb,
+	0xf4, 0xcf, 0xf6, 0xce, 0x9b, 0xe1, 0x10, 0xcb, 0x46, 0x1b, 0x22, 0x62, 0x9f, 0x81, 0xba, 0xdb,
+	0x6c, 0x43, 0xbe, 0xc2, 0xdd, 0x36, 0x44, 0xc4, 0x3e, 0x07, 0xf5, 0x42, 0xa3, 0x0d, 0x29, 0x36,
+	0xdb, 0x50, 0x5c, 0x7e, 0x01, 0x5a, 0x82, 0x7d, 0xe8, 0x16, 0x15, 0x9b, 0x96, 0x58, 0xa1, 0xf9,
+	0x25, 0x88, 0x97, 0x37, 0xfd, 0x9b, 0x67, 0x6e, 0x55, 0x7b, 0x46, 0x3c, 0xad, 0x01, 0x91, 0xce,
+	0xaf, 0x40, 0xdb, 0x46, 0xad, 0x1e, 0x10, 0x09, 0xbd, 0x40, 0xef, 0x76, 0x76, 0xb1, 0x93, 0xa7,
+	0xd9, 0x28, 0x1f, 0xb2, 0x57, 0x7d, 0xb9, 0x92, 0xd6, 0xfa, 0x28, 0x1f, 0xc6, 0x81, 0xbd, 0x93,
+	0x2b, 0x52, 0x10, 0x88, 0x7a, 0xe2, 0xa4, 0x98, 0x41, 0xe2, 0x6b, 0x98, 0xe8, 0x37, 0xf2, 0x9e,
+	0x96, 0xdf, 0x07, 0x8f, 0xd0, 0xb5, 0x9a, 0x61, 0x92, 0xb3, 0xd7, 0x55, 0x52, 0x9e, 0xe4, 0x66,
+	0xa9, 0x68, 0x96, 0xe4, 0xc1, 0x45, 0x7a, 0xdc, 0xdd, 0x93, 0xee, 0xf1, 0x0d, 0x5f, 0xae, 0x0b,
+	0x7b, 0x3c, 0xe6, 0xec, 0x4b, 0x35, 0xf9, 0x68, 0x23, 0x55, 0x75, 0xf9, 0x26, 0xa6, 0xfa, 0xcd,
+	0x4c, 0xd5, 0x66, 0x9f, 0x06, 0x75, 0xd3, 0x24, 0x67, 0x6f, 0xa9, 0x34, 0xe8, 0xb3, 0xeb, 0x1a,
+	0x26, 0xf9, 0xbd, 0x82, 0x76, 0x9c, 0xab, 0xb4, 0xf3, 0xbf, 0x01, 0x1e, 0x51, 0xc7, 0xe4, 0xff,
+	0x10, 0xe6, 0x8a, 0x2d, 0x65, 0x90, 0xe7, 0xdc, 0x07, 0x9c, 0x0b, 0x0e, 0xe6, 0xbd, 0x22, 0x2f,
+	0x42, 0xe6, 0x9e, 0x80, 0x79, 0x17, 0x20, 0xcf, 0x3a, 0xc2, 0x9c, 0x63, 0x19, 0xf3, 0xfe, 0xc5,
+	0xf3, 0xdb, 0x9c, 0x6d, 0x98, 0xb8, 0x4c, 0x17, 0xd5, 0xe1, 0x73, 0xe2, 0x1e, 0xda, 0x92, 0xa7,
+	0xcd, 0x12, 0x6d, 0x6d, 0x5f, 0x8e, 0xaf, 0x76, 0xef, 0x0a, 0x16, 0x29, 0x9c, 0x45, 0x5d, 0x72,
+	0xe9, 0xb1, 0xed, 0x8b, 0x59, 0x51, 0x64, 0xe3, 0xb4, 0x97, 0x15, 0xe3, 0x24, 0xcf, 0x7a, 0xc5,
+	0x34, 0xdb, 0x90, 0x87, 0xd8, 0xc6, 0xde, 0xfe, 0x00, 0x7f, 0xdb, 0x5b, 0xcf, 0xd2, 0x7c, 0x3d,
+	0x2b, 0x36, 0xca, 0x74, 0x56, 0x0e, 0x92, 0x32, 0xc1, 0x70, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0xd7, 0x14, 0x76, 0x33, 0xeb, 0x0f, 0x00, 0x00,
 }
diff --git a/cmd/protoc-gen-go/testdata/proto2/fields.proto b/cmd/protoc-gen-go/testdata/proto2/fields.proto
index 1e65c6d..f0a2bb3 100644
--- a/cmd/protoc-gen-go/testdata/proto2/fields.proto
+++ b/cmd/protoc-gen-go/testdata/proto2/fields.proto
@@ -9,7 +9,7 @@
 option go_package = "google.golang.org/proto/cmd/protoc-gen-go/testdata/proto2";
 
 message FieldTestMessage {
-  optional string   optional_bool     = 1;
+  optional bool     optional_bool     = 1;
   optional Enum     optional_enum     = 2;
   optional int32    optional_int32    = 3;
   optional sint32   optional_sint32   = 4;
@@ -30,7 +30,7 @@
     optional string optional_group = 19;
   }
 
-  required string   required_bool     = 101;
+  required bool     required_bool     = 101;
   required Enum     required_enum     = 102;
   required int32    required_int32    = 103;
   required sint32   required_sint32   = 104;
@@ -51,7 +51,7 @@
     required string required_group = 119;
   }
 
-  repeated string   repeated_bool     = 201;
+  repeated bool     repeated_bool     = 201;
   repeated Enum     repeated_enum     = 202;
   repeated int32    repeated_int32    = 203;
   repeated sint32   repeated_sint32   = 204;
@@ -72,6 +72,33 @@
     repeated string repeated_group = 219;
   }
 
-  enum Enum { ZERO = 0; }
+  optional bool     default_bool     = 301 [default=true];
+  optional Enum     default_enum     = 302 [default=ONE];
+  optional int32    default_int32    = 303 [default=1];
+  optional sint32   default_sint32   = 304 [default=1];
+  optional uint32   default_uint32   = 305 [default=1];
+  optional int64    default_int64    = 306 [default=1];
+  optional sint64   default_sint64   = 307 [default=1];
+  optional uint64   default_uint64   = 308 [default=1];
+  optional sfixed32 default_sfixed32 = 309 [default=1];
+  optional fixed32  default_fixed32  = 310 [default=1];
+  optional float    default_float    = 311 [default=1.5];
+  optional sfixed64 default_sfixed64 = 312 [default=1];
+  optional fixed64  default_fixed64  = 313 [default=1];
+  optional double   default_double   = 314 [default=1.5];
+  optional string   default_string   = 315 [default="x,y"];
+  optional bytes    default_bytes    = 316 [default="x,y"];
+
+  optional float  default_float_neginf  = 400 [default=-inf];
+  optional float  default_float_posinf  = 401 [default=inf];
+  optional float  default_float_nan     = 402 [default=nan];
+  optional double default_double_neginf = 403 [default=-inf];
+  optional double default_double_posinf = 404 [default=inf];
+  optional double default_double_nan    = 405 [default=nan];
+
+  enum Enum {
+    ZERO = 0;
+    ONE = 1;
+  }
   message Message {}
 }