cmd/protoc-gen-go: add "packed" encoding tag to fields

Change-Id: I423039d6c9edb50a07781a6e76336ed364f21866
Reviewed-on: https://go-review.googlesource.com/136359
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/cmd/protoc-gen-go/main.go b/cmd/protoc-gen-go/main.go
index d5bef26..e7119f1 100644
--- a/cmd/protoc-gen-go/main.go
+++ b/cmd/protoc-gen-go/main.go
@@ -631,6 +631,9 @@
 	case protoreflect.Repeated:
 		tag = append(tag, "rep")
 	}
+	if field.Desc.IsPacked() {
+		tag = append(tag, "packed")
+	}
 	// TODO: packed
 	// name
 	name := string(field.Desc.Name())
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
index 92d9e23..b09aafb 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.pb.go
@@ -60,6 +60,23 @@
 	OptionalString       string                               `protobuf:"bytes,15,opt,name=optional_string,json=optionalString,proto3" json:"optional_string,omitempty"`
 	OptionalBytes        []byte                               `protobuf:"bytes,16,opt,name=optional_bytes,json=optionalBytes,proto3" json:"optional_bytes,omitempty"`
 	Optional_Message     *FieldTestMessage_Message            `protobuf:"bytes,17,opt,name=optional_Message,json=optionalMessage,proto3" json:"optional_Message,omitempty"`
+	RepeatedBool         []bool                               `protobuf:"varint,201,rep,packed,name=repeated_bool,json=repeatedBool,proto3" json:"repeated_bool,omitempty"`
+	RepeatedEnum         []FieldTestMessage_Enum              `protobuf:"varint,202,rep,packed,name=repeated_enum,json=repeatedEnum,proto3,enum=goproto.protoc.proto3.FieldTestMessage_Enum" json:"repeated_enum,omitempty"`
+	RepeatedInt32        []int32                              `protobuf:"varint,203,rep,packed,name=repeated_int32,json=repeatedInt32,proto3" json:"repeated_int32,omitempty"`
+	RepeatedSint32       []int32                              `protobuf:"zigzag32,204,rep,packed,name=repeated_sint32,json=repeatedSint32,proto3" json:"repeated_sint32,omitempty"`
+	RepeatedUint32       []uint32                             `protobuf:"varint,205,rep,packed,name=repeated_uint32,json=repeatedUint32,proto3" json:"repeated_uint32,omitempty"`
+	RepeatedInt64        []int64                              `protobuf:"varint,206,rep,packed,name=repeated_int64,json=repeatedInt64,proto3" json:"repeated_int64,omitempty"`
+	RepeatedSint64       []int64                              `protobuf:"zigzag64,207,rep,packed,name=repeated_sint64,json=repeatedSint64,proto3" json:"repeated_sint64,omitempty"`
+	RepeatedUint64       []uint64                             `protobuf:"varint,208,rep,packed,name=repeated_uint64,json=repeatedUint64,proto3" json:"repeated_uint64,omitempty"`
+	RepeatedSfixed32     []int32                              `protobuf:"fixed32,209,rep,packed,name=repeated_sfixed32,json=repeatedSfixed32,proto3" json:"repeated_sfixed32,omitempty"`
+	RepeatedFixed32      []uint32                             `protobuf:"fixed32,210,rep,packed,name=repeated_fixed32,json=repeatedFixed32,proto3" json:"repeated_fixed32,omitempty"`
+	RepeatedFloat        []float32                            `protobuf:"fixed32,211,rep,packed,name=repeated_float,json=repeatedFloat,proto3" json:"repeated_float,omitempty"`
+	RepeatedSfixed64     []int64                              `protobuf:"fixed64,212,rep,packed,name=repeated_sfixed64,json=repeatedSfixed64,proto3" json:"repeated_sfixed64,omitempty"`
+	RepeatedFixed64      []uint64                             `protobuf:"fixed64,213,rep,packed,name=repeated_fixed64,json=repeatedFixed64,proto3" json:"repeated_fixed64,omitempty"`
+	RepeatedDouble       []float64                            `protobuf:"fixed64,214,rep,packed,name=repeated_double,json=repeatedDouble,proto3" json:"repeated_double,omitempty"`
+	RepeatedString       []string                             `protobuf:"bytes,215,rep,name=repeated_string,json=repeatedString,proto3" json:"repeated_string,omitempty"`
+	RepeatedBytes        [][]byte                             `protobuf:"bytes,216,rep,name=repeated_bytes,json=repeatedBytes,proto3" json:"repeated_bytes,omitempty"`
+	Repeated_Message     []*FieldTestMessage_Message          `protobuf:"bytes,217,rep,name=repeated_Message,json=repeatedMessage,proto3" json:"repeated_Message,omitempty"`
 	MapInt32Int64        map[int32]int64                      `protobuf:"bytes,500,rep,name=map_int32_int64,json=mapInt32Int64,proto3" json:"map_int32_int64,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
 	MapStringMessage     map[string]*FieldTestMessage_Message `protobuf:"bytes,501,rep,name=map_string_message,json=mapStringMessage,proto3" json:"map_string_message,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	MapFixed64Enum       map[uint64]FieldTestMessage_Enum     `protobuf:"bytes,502,rep,name=map_fixed64_enum,json=mapFixed64Enum,proto3" json:"map_fixed64_enum,omitempty" protobuf_key:"fixed64,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=goproto.protoc.proto3.FieldTestMessage_Enum"`
@@ -212,6 +229,125 @@
 	return nil
 }
 
+func (m *FieldTestMessage) GetRepeatedBool() []bool {
+	if m != nil {
+		return m.RepeatedBool
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedEnum() []FieldTestMessage_Enum {
+	if m != nil {
+		return m.RepeatedEnum
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedInt32() []int32 {
+	if m != nil {
+		return m.RepeatedInt32
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedSint32() []int32 {
+	if m != nil {
+		return m.RepeatedSint32
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedUint32() []uint32 {
+	if m != nil {
+		return m.RepeatedUint32
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedInt64() []int64 {
+	if m != nil {
+		return m.RepeatedInt64
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedSint64() []int64 {
+	if m != nil {
+		return m.RepeatedSint64
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedUint64() []uint64 {
+	if m != nil {
+		return m.RepeatedUint64
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedSfixed32() []int32 {
+	if m != nil {
+		return m.RepeatedSfixed32
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedFixed32() []uint32 {
+	if m != nil {
+		return m.RepeatedFixed32
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedFloat() []float32 {
+	if m != nil {
+		return m.RepeatedFloat
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedSfixed64() []int64 {
+	if m != nil {
+		return m.RepeatedSfixed64
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedFixed64() []uint64 {
+	if m != nil {
+		return m.RepeatedFixed64
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedDouble() []float64 {
+	if m != nil {
+		return m.RepeatedDouble
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedString() []string {
+	if m != nil {
+		return m.RepeatedString
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeatedBytes() [][]byte {
+	if m != nil {
+		return m.RepeatedBytes
+	}
+	return nil
+}
+
+func (m *FieldTestMessage) GetRepeated_Message() []*FieldTestMessage_Message {
+	if m != nil {
+		return m.Repeated_Message
+	}
+	return nil
+}
+
 func (m *FieldTestMessage) GetMapInt32Int64() map[int32]int64 {
 	if m != nil {
 		return m.MapInt32Int64
@@ -276,43 +412,57 @@
 func init() { proto.RegisterFile("proto3/fields.proto", fileDescriptor_f1e3ea068187307c) }
 
 var fileDescriptor_f1e3ea068187307c = []byte{
-	// 596 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x4b, 0x8f, 0xd3, 0x3c,
-	0x18, 0x85, 0x3f, 0x4f, 0x7a, 0x99, 0xba, 0xb7, 0xd4, 0xf3, 0x8d, 0x64, 0xcd, 0xca, 0x1a, 0x84,
-	0x30, 0x82, 0x49, 0xa5, 0x36, 0x8a, 0x60, 0x46, 0x48, 0xa8, 0xa2, 0x95, 0x58, 0x20, 0x44, 0x80,
-	0x4d, 0x37, 0x55, 0xda, 0xba, 0x51, 0x44, 0x12, 0x57, 0x8d, 0x83, 0xe8, 0x4f, 0xe2, 0xff, 0x01,
-	0x6b, 0x14, 0x3b, 0xcd, 0xad, 0x5d, 0x4c, 0x59, 0xd9, 0x3e, 0x3d, 0x7d, 0x9f, 0x1c, 0xfb, 0xb5,
-	0xe1, 0xd5, 0x76, 0xc7, 0x05, 0x1f, 0x0f, 0x37, 0x1e, 0xf3, 0xd7, 0x91, 0x21, 0x57, 0xe8, 0xda,
-	0xe5, 0x72, 0xa2, 0x96, 0x2b, 0x35, 0x8c, 0x6f, 0x7f, 0xb6, 0xa1, 0x3e, 0x4b, 0x7c, 0x5f, 0x58,
-	0x24, 0x3e, 0xb0, 0x28, 0x72, 0x5c, 0x86, 0x9e, 0xc0, 0x2e, 0xdf, 0x0a, 0x8f, 0x87, 0x8e, 0xbf,
-	0x58, 0x72, 0xee, 0x63, 0x40, 0x00, 0x6d, 0xd9, 0x9d, 0x83, 0x38, 0xe1, 0xdc, 0x47, 0x9f, 0x0a,
-	0x26, 0x16, 0xc6, 0x01, 0xbe, 0x20, 0x80, 0xf6, 0x46, 0x2f, 0x8d, 0x93, 0x20, 0xa3, 0x0a, 0x31,
-	0xa6, 0x61, 0x1c, 0xe4, 0x25, 0x93, 0x15, 0x7a, 0x0a, 0x7b, 0x59, 0x49, 0x2f, 0x14, 0xe3, 0x11,
-	0xd6, 0x08, 0xa0, 0x75, 0x3b, 0x03, 0xbd, 0x4f, 0x44, 0xf4, 0x0c, 0xf6, 0x33, 0x5b, 0xa4, 0x7c,
-	0x35, 0x02, 0xe8, 0xc0, 0xce, 0xfe, 0xfd, 0xd9, 0x3b, 0x32, 0xc6, 0xca, 0x58, 0x27, 0x80, 0x76,
-	0x73, 0xe3, 0x57, 0x65, 0xac, 0x80, 0x2d, 0x13, 0x37, 0x08, 0xa0, 0x5a, 0x09, 0x6c, 0x99, 0x47,
-	0x60, 0xcb, 0xc4, 0x4d, 0x02, 0x28, 0x2a, 0x83, 0x2b, 0xc6, 0x58, 0x19, 0x2f, 0x09, 0xa0, 0xb5,
-	0x32, 0xd8, 0x32, 0xd1, 0x0b, 0x38, 0xc8, 0x2b, 0x6e, 0xbc, 0x1f, 0x6c, 0x3d, 0x1e, 0xe1, 0x16,
-	0x01, 0xb4, 0x6f, 0xeb, 0x59, 0xcd, 0x54, 0x47, 0xcf, 0x61, 0xa6, 0x2d, 0x0e, 0x5e, 0x48, 0x00,
-	0x6d, 0xda, 0x19, 0x6d, 0x96, 0x5a, 0x8b, 0x81, 0x36, 0x3e, 0x77, 0x04, 0x6e, 0x13, 0x40, 0x2f,
-	0xf2, 0x40, 0xb3, 0x44, 0x3c, 0x81, 0xb7, 0x4c, 0xdc, 0x21, 0x80, 0xea, 0x55, 0xbc, 0x65, 0x1e,
-	0xe3, 0x2d, 0x13, 0x77, 0x09, 0xa0, 0x8d, 0x0a, 0xbe, 0x92, 0x7f, 0xcd, 0xe3, 0xa5, 0xcf, 0x70,
-	0x8f, 0x00, 0x0a, 0xf2, 0xfc, 0xef, 0xa4, 0x5a, 0xde, 0x51, 0xb1, 0xf3, 0x42, 0x17, 0xf7, 0x65,
-	0xaf, 0xe5, 0x3b, 0x2a, 0xd5, 0x52, 0xa0, 0xe5, 0x5e, 0xb0, 0x08, 0xeb, 0x04, 0xd0, 0x4e, 0x1e,
-	0x68, 0x92, 0x88, 0x68, 0x5e, 0xf8, 0xc6, 0xb4, 0xd1, 0xf0, 0x80, 0x00, 0xda, 0x1e, 0x0d, 0x1f,
-	0xdb, 0x97, 0xe9, 0x98, 0x87, 0x3a, 0xdc, 0x8a, 0x15, 0xec, 0x07, 0xce, 0x56, 0x35, 0x66, 0xda,
-	0x25, 0xbf, 0x34, 0xa2, 0xd1, 0xf6, 0xe8, 0xfe, 0xd1, 0xb5, 0x9d, 0xad, 0x6c, 0x61, 0xd9, 0x4e,
-	0xd3, 0x50, 0xec, 0xf6, 0x76, 0x37, 0x28, 0x6a, 0xc8, 0x87, 0x28, 0x81, 0xa8, 0xbd, 0x58, 0x04,
-	0x69, 0x84, 0xdf, 0x8a, 0xf3, 0xe6, 0x0c, 0x8e, 0xda, 0xb7, 0x54, 0x50, 0x28, 0x3d, 0xa8, 0xc8,
-	0x68, 0x03, 0x13, 0xed, 0x70, 0x9a, 0xea, 0x1a, 0xff, 0x51, 0xac, 0x87, 0x33, 0x58, 0xe9, 0xb1,
-	0x27, 0x77, 0x58, 0x91, 0x7a, 0x41, 0x49, 0xbc, 0x79, 0x0b, 0xd1, 0x71, 0x74, 0xa4, 0x43, 0xed,
-	0x1b, 0xdb, 0xcb, 0xc7, 0xa5, 0x6e, 0x27, 0x53, 0xf4, 0x3f, 0xac, 0x7f, 0x77, 0xfc, 0x98, 0xc9,
-	0xb7, 0x44, 0xb3, 0xd5, 0xe2, 0xfe, 0xe2, 0x15, 0xb8, 0x11, 0xf0, 0xfa, 0x64, 0xa8, 0x62, 0x91,
-	0x96, 0x2a, 0x32, 0x2d, 0x16, 0xf9, 0x87, 0x83, 0x2f, 0x50, 0x39, 0xbc, 0x3a, 0x11, 0xaf, 0xc8,
-	0x6c, 0x28, 0xe6, 0xa4, 0xc8, 0x3c, 0xf7, 0x11, 0x2c, 0x00, 0x5b, 0xb0, 0x99, 0xfe, 0x74, 0xab,
-	0xc3, 0x9a, 0x7c, 0x14, 0x2f, 0x61, 0x6d, 0x3e, 0xb5, 0x3f, 0xea, 0xff, 0x4d, 0x1e, 0xe6, 0xaf,
-	0x5d, 0xce, 0x5d, 0x9f, 0x19, 0x2e, 0xf7, 0x9d, 0xd0, 0x35, 0xf8, 0xce, 0x1d, 0xca, 0xca, 0xc3,
-	0x55, 0xb0, 0x56, 0xb3, 0xd5, 0x9d, 0xcb, 0xc2, 0x3b, 0x97, 0x0f, 0x05, 0x8b, 0xc4, 0xda, 0x11,
-	0x8e, 0x92, 0xc7, 0xcb, 0x86, 0x1a, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xd2, 0xfc, 0xf5,
-	0x1d, 0x06, 0x00, 0x00,
+	// 826 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x95, 0xdb, 0x6f, 0xda, 0x48,
+	0x14, 0xc6, 0x77, 0xb8, 0x86, 0x09, 0x17, 0x33, 0xd9, 0x48, 0xa3, 0x3c, 0x8d, 0xb2, 0xb7, 0xd9,
+	0xdd, 0x04, 0x24, 0xb0, 0xac, 0xdd, 0x44, 0x2b, 0xad, 0xd0, 0x12, 0x69, 0x1f, 0xaa, 0xaa, 0x6e,
+	0xfb, 0x92, 0x3e, 0x44, 0x06, 0x06, 0x0b, 0xd5, 0xf6, 0x20, 0x30, 0x55, 0xf3, 0x27, 0xf6, 0x9e,
+	0xde, 0xdb, 0xff, 0xa3, 0xed, 0x73, 0x35, 0x9e, 0xb1, 0x3d, 0x36, 0x3c, 0x84, 0x3c, 0xd9, 0x3e,
+	0x7c, 0x7c, 0xbf, 0x39, 0xc7, 0xe7, 0x03, 0xb8, 0x37, 0x5f, 0xf0, 0x90, 0xf7, 0xbb, 0xd3, 0x19,
+	0xf3, 0x26, 0xcb, 0x4e, 0xf4, 0x84, 0xf6, 0x5d, 0x1e, 0xdd, 0xc8, 0xc7, 0xb1, 0xbc, 0xf4, 0x0f,
+	0xaf, 0xda, 0xd0, 0x38, 0x13, 0xba, 0x7b, 0x6c, 0x19, 0xde, 0x62, 0xcb, 0xa5, 0xe3, 0x32, 0xf4,
+	0x13, 0x6c, 0xf0, 0x79, 0x38, 0xe3, 0x81, 0xe3, 0x5d, 0x8c, 0x38, 0xf7, 0x30, 0x20, 0x80, 0xd6,
+	0xec, 0x7a, 0x5c, 0x1c, 0x70, 0xee, 0xa1, 0x3b, 0x9a, 0x88, 0x05, 0x2b, 0x1f, 0x17, 0x08, 0xa0,
+	0xcd, 0xde, 0x51, 0x67, 0x23, 0xa8, 0x93, 0x87, 0x74, 0x86, 0xc1, 0xca, 0x4f, 0x2d, 0xc5, 0x13,
+	0xfa, 0x05, 0x36, 0x13, 0xcb, 0x59, 0x10, 0xf6, 0x7b, 0xb8, 0x48, 0x00, 0x2d, 0xdb, 0x09, 0xe8,
+	0x7f, 0x51, 0x44, 0xbf, 0xc1, 0x56, 0x22, 0x5b, 0x4a, 0x5d, 0x89, 0x00, 0xda, 0xb6, 0x93, 0x6f,
+	0xdf, 0x9d, 0xad, 0x09, 0x57, 0x52, 0x58, 0x26, 0x80, 0x36, 0x52, 0xe1, 0x7d, 0x29, 0xcc, 0x81,
+	0x2d, 0x13, 0x57, 0x08, 0xa0, 0xc5, 0x0c, 0xd8, 0x32, 0xd7, 0xc0, 0x96, 0x89, 0xab, 0x04, 0x50,
+	0x94, 0x05, 0xe7, 0x84, 0x2b, 0x29, 0xdc, 0x21, 0x80, 0x96, 0xb2, 0x60, 0xcb, 0x44, 0x7f, 0xc2,
+	0x76, 0xea, 0x38, 0x9d, 0x3d, 0x66, 0x93, 0x7e, 0x0f, 0xd7, 0x08, 0xa0, 0x2d, 0xdb, 0x48, 0x3c,
+	0x55, 0x1d, 0xfd, 0x0e, 0x93, 0xda, 0x45, 0xac, 0x85, 0x04, 0xd0, 0xaa, 0x9d, 0xd0, 0xce, 0x94,
+	0x54, 0x6f, 0x68, 0xea, 0x71, 0x27, 0xc4, 0xbb, 0x04, 0xd0, 0x42, 0xda, 0xd0, 0x99, 0x28, 0x6e,
+	0xc0, 0x5b, 0x26, 0xae, 0x13, 0x40, 0x8d, 0x3c, 0xde, 0x32, 0xd7, 0xf1, 0x96, 0x89, 0x1b, 0x04,
+	0xd0, 0x4a, 0x0e, 0x9f, 0xeb, 0x7f, 0xc2, 0x57, 0x23, 0x8f, 0xe1, 0x26, 0x01, 0x14, 0xa4, 0xfd,
+	0xff, 0x17, 0x55, 0xb3, 0x13, 0x0d, 0x17, 0xb3, 0xc0, 0xc5, 0xad, 0x68, 0xd7, 0xd2, 0x89, 0x46,
+	0xd5, 0x4c, 0x43, 0xa3, 0xcb, 0x90, 0x2d, 0xb1, 0x41, 0x00, 0xad, 0xa7, 0x0d, 0x0d, 0x44, 0x11,
+	0x9d, 0x6b, 0x67, 0x54, 0x8b, 0x86, 0xdb, 0x04, 0xd0, 0xdd, 0x5e, 0xf7, 0xba, 0x7b, 0xa9, 0xae,
+	0x69, 0x53, 0x71, 0x2a, 0x7e, 0x86, 0x8d, 0x05, 0x9b, 0x33, 0x27, 0x64, 0x13, 0x99, 0x8a, 0x27,
+	0x80, 0x14, 0xe9, 0x8e, 0x5d, 0x8f, 0xab, 0x51, 0x2c, 0x6c, 0x4d, 0x15, 0xc5, 0xe2, 0xa9, 0x50,
+	0x6d, 0x9d, 0x8b, 0xd8, 0x23, 0xca, 0xc5, 0xaf, 0xb0, 0x99, 0x78, 0xca, 0x35, 0x7e, 0x26, 0x4c,
+	0xcb, 0x76, 0x82, 0x92, 0xc1, 0xa0, 0xb0, 0x95, 0xe8, 0x54, 0x30, 0x9e, 0x0b, 0x61, 0xdb, 0x4e,
+	0xbe, 0xaf, 0x92, 0xa1, 0x2b, 0x55, 0x32, 0x5e, 0x08, 0x65, 0x23, 0x55, 0xaa, 0x68, 0xe4, 0xd8,
+	0x96, 0x89, 0x5f, 0x0a, 0x61, 0x31, 0xc3, 0xb6, 0xcc, 0x35, 0xb6, 0x65, 0xe2, 0x57, 0x42, 0x88,
+	0xb2, 0xec, 0x9c, 0x52, 0x85, 0xe3, 0x4a, 0x28, 0x4b, 0x59, 0xb6, 0x65, 0xa2, 0x23, 0xd8, 0x4e,
+	0x3d, 0xe3, 0x8d, 0x7f, 0x2d, 0xb4, 0x2d, 0xdb, 0x48, 0x5c, 0xe3, 0x78, 0xfc, 0x01, 0x93, 0x5a,
+	0x12, 0x8f, 0x37, 0x42, 0x5c, 0xb5, 0x13, 0x60, 0x9c, 0x0f, 0xbd, 0x2b, 0x99, 0x8f, 0xb7, 0x42,
+	0x59, 0x48, 0xbb, 0x92, 0x01, 0x59, 0x3f, 0x81, 0x65, 0xe2, 0x77, 0x42, 0x6a, 0xe4, 0x4f, 0x60,
+	0x99, 0xeb, 0x27, 0xb0, 0x4c, 0xfc, 0x5e, 0x88, 0x2b, 0xb9, 0x13, 0xe4, 0xa6, 0xa0, 0x22, 0xf2,
+	0x41, 0x48, 0x41, 0x3a, 0x05, 0x95, 0x91, 0xcc, 0x64, 0x65, 0x46, 0x3e, 0x0a, 0x65, 0x4d, 0x9b,
+	0xac, 0x0c, 0x89, 0xde, 0x95, 0x0c, 0xc9, 0x27, 0x21, 0xac, 0xa7, 0x5d, 0xc9, 0x94, 0x3c, 0xd0,
+	0xce, 0x19, 0xa7, 0xe4, 0xb3, 0x50, 0xde, 0x24, 0x26, 0xb1, 0x53, 0x1c, 0x93, 0x31, 0x6c, 0xf9,
+	0xce, 0x5c, 0xee, 0xa9, 0xda, 0x98, 0x2f, 0xc5, 0xc8, 0xfb, 0xe4, 0xda, 0xde, 0xce, 0x3c, 0x5a,
+	0xe8, 0x68, 0xb3, 0x86, 0x41, 0xb8, 0xb8, 0xb4, 0x1b, 0xbe, 0x5e, 0x43, 0x1e, 0x44, 0x02, 0x22,
+	0xc7, 0x71, 0xe1, 0xab, 0x1e, 0xbe, 0x4a, 0xce, 0x3f, 0x5b, 0x70, 0xe4, 0xe4, 0x54, 0x41, 0xa2,
+	0x0c, 0x3f, 0x57, 0x46, 0x53, 0x28, 0x6a, 0xf1, 0x2b, 0x95, 0xb1, 0xfe, 0x26, 0x59, 0xa7, 0x5b,
+	0xb0, 0xd4, 0xab, 0x17, 0x91, 0x96, 0xa4, 0xa6, 0x9f, 0x29, 0x1e, 0xfc, 0x0b, 0xd1, 0x7a, 0xeb,
+	0xc8, 0x80, 0xc5, 0x87, 0xec, 0x32, 0xfa, 0x0f, 0x2e, 0xdb, 0xe2, 0x16, 0xfd, 0x08, 0xcb, 0x8f,
+	0x1c, 0x6f, 0xc5, 0xa2, 0xbf, 0xdc, 0xa2, 0x2d, 0x1f, 0x4e, 0x0a, 0x7f, 0x81, 0x83, 0x10, 0xee,
+	0x6f, 0x6c, 0x4a, 0x37, 0xa9, 0x49, 0x93, 0xa1, 0x6e, 0x72, 0x83, 0x17, 0xaf, 0x51, 0x39, 0xdc,
+	0xdb, 0xd0, 0x9e, 0xce, 0xac, 0x48, 0xe6, 0x40, 0x67, 0x6e, 0xfb, 0x9b, 0xa8, 0x01, 0x6b, 0xb0,
+	0xaa, 0x3e, 0x3a, 0x34, 0x60, 0x29, 0xfa, 0x8d, 0xdc, 0x81, 0xa5, 0xf3, 0xa1, 0x7d, 0xdb, 0xf8,
+	0x61, 0x70, 0x7a, 0xfe, 0xb7, 0xcb, 0xb9, 0xeb, 0xb1, 0x8e, 0xcb, 0x3d, 0x27, 0x70, 0x3b, 0x7c,
+	0xe1, 0x76, 0x23, 0xe7, 0xee, 0xd8, 0x9f, 0xc8, 0xbb, 0xf1, 0xb1, 0xcb, 0x82, 0x63, 0x97, 0x77,
+	0x43, 0xb6, 0x0c, 0x27, 0x4e, 0xe8, 0xc8, 0x72, 0x7f, 0x54, 0x91, 0xd7, 0xef, 0x01, 0x00, 0x00,
+	0xff, 0xff, 0xc1, 0x70, 0x3f, 0x3d, 0x44, 0x09, 0x00, 0x00,
 }
diff --git a/cmd/protoc-gen-go/testdata/proto3/fields.proto b/cmd/protoc-gen-go/testdata/proto3/fields.proto
index f16bf81..5ae7344 100644
--- a/cmd/protoc-gen-go/testdata/proto3/fields.proto
+++ b/cmd/protoc-gen-go/testdata/proto3/fields.proto
@@ -27,6 +27,24 @@
   bytes    optional_bytes    = 16;
   Message  optional_Message  = 17;
 
+  repeated bool     repeated_bool     = 201;
+  repeated Enum     repeated_enum     = 202;
+  repeated int32    repeated_int32    = 203;
+  repeated sint32   repeated_sint32   = 204;
+  repeated uint32   repeated_uint32   = 205;
+  repeated int64    repeated_int64    = 206;
+  repeated sint64   repeated_sint64   = 207;
+  repeated uint64   repeated_uint64   = 208;
+  repeated sfixed32 repeated_sfixed32 = 209;
+  repeated fixed32  repeated_fixed32  = 210;
+  repeated float    repeated_float    = 211;
+  repeated sfixed64 repeated_sfixed64 = 212;
+  repeated fixed64  repeated_fixed64  = 213;
+  repeated double   repeated_double   = 214;
+  repeated string   repeated_string   = 215;
+  repeated bytes    repeated_bytes    = 216;
+  repeated Message  repeated_Message  = 217;
+
   map<int32, int64>   map_int32_int64    = 500;
   map<string,Message> map_string_message = 501;
   map<fixed64,Enum>   map_fixed64_enum   = 502;
diff --git a/reflect/prototype/protofile_desc.go b/reflect/prototype/protofile_desc.go
index 8ab3279..161980e 100644
--- a/reflect/prototype/protofile_desc.go
+++ b/reflect/prototype/protofile_desc.go
@@ -95,7 +95,7 @@
 	}
 
 	var err error
-	f.Messages, err = messagesFromDescriptorProto(fd.GetMessageType(), r)
+	f.Messages, err = messagesFromDescriptorProto(fd.GetMessageType(), f.Syntax, r)
 	if err != nil {
 		return nil, err
 	}
@@ -115,7 +115,7 @@
 	return NewFile(&f)
 }
 
-func messagesFromDescriptorProto(mds []*descriptorV1.DescriptorProto, r *protoregistry.Files) (ms []Message, err error) {
+func messagesFromDescriptorProto(mds []*descriptorV1.DescriptorProto, syntax protoreflect.Syntax, r *protoregistry.Files) (ms []Message, err error) {
 	for _, md := range mds {
 		var m Message
 		m.Name = protoreflect.Name(md.GetName())
@@ -127,7 +127,16 @@
 			f.Cardinality = protoreflect.Cardinality(fd.GetLabel())
 			f.Kind = protoreflect.Kind(fd.GetType())
 			f.JSONName = fd.GetJsonName()
-			f.IsPacked = fd.GetOptions().GetPacked()
+			if opts := fd.GetOptions(); opts != nil && opts.Packed != nil {
+				f.IsPacked = *opts.Packed
+			} else {
+				// https://developers.google.com/protocol-buffers/docs/proto3:
+				// "In proto3, repeated fields of scalar numeric types use packed
+				// encoding by default."
+				f.IsPacked = (syntax == protoreflect.Proto3 &&
+					f.Cardinality == protoreflect.Repeated &&
+					isScalarNumeric[f.Kind])
+			}
 			f.IsWeak = fd.GetOptions().GetWeak()
 			if fd.DefaultValue != nil {
 				f.Default, err = parseDefault(fd.GetDefaultValue(), f.Kind)
@@ -172,7 +181,7 @@
 			})
 		}
 
-		m.Messages, err = messagesFromDescriptorProto(md.GetNestedType(), r)
+		m.Messages, err = messagesFromDescriptorProto(md.GetNestedType(), syntax, r)
 		if err != nil {
 			return nil, err
 		}
@@ -190,6 +199,23 @@
 	return ms, nil
 }
 
+var isScalarNumeric = map[protoreflect.Kind]bool{
+	protoreflect.BoolKind:     true,
+	protoreflect.EnumKind:     true,
+	protoreflect.Int32Kind:    true,
+	protoreflect.Sint32Kind:   true,
+	protoreflect.Uint32Kind:   true,
+	protoreflect.Int64Kind:    true,
+	protoreflect.Sint64Kind:   true,
+	protoreflect.Uint64Kind:   true,
+	protoreflect.Sfixed32Kind: true,
+	protoreflect.Fixed32Kind:  true,
+	protoreflect.FloatKind:    true,
+	protoreflect.Sfixed64Kind: true,
+	protoreflect.Fixed64Kind:  true,
+	protoreflect.DoubleKind:   true,
+}
+
 func enumsFromDescriptorProto(eds []*descriptorV1.EnumDescriptorProto, r *protoregistry.Files) (es []Enum, err error) {
 	for _, ed := range eds {
 		var e Enum
@@ -212,6 +238,11 @@
 		x.Number = protoreflect.FieldNumber(xd.GetNumber())
 		x.Cardinality = protoreflect.Cardinality(xd.GetLabel())
 		x.Kind = protoreflect.Kind(xd.GetType())
+		// TODO: When a proto3 file extends a proto2 message (permitted only for
+		// extending descriptor options), does the extension have proto2 or proto3
+		// semantics? If the latter, repeated, scalar, numeric, proto3 extension
+		// fields should default to packed. If the former, perhaps the extension syntax
+		// should be protoreflect.Proto2.
 		x.IsPacked = xd.GetOptions().GetPacked()
 		if xd.DefaultValue != nil {
 			x.Default, err = parseDefault(xd.GetDefaultValue(), x.Kind)