// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// source: internal/testprotos/race/message/test.proto

package message

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
	unsafe "unsafe"
)

type MyMessage struct {
	state           protoimpl.MessageState `protogen:"open.v1"`
	I32             *int32                 `protobuf:"varint,1,opt,name=i32" json:"i32,omitempty"`
	extensionFields protoimpl.ExtensionFields
	unknownFields   protoimpl.UnknownFields
	sizeCache       protoimpl.SizeCache
}

func (x *MyMessage) Reset() {
	*x = MyMessage{}
	mi := &file_internal_testprotos_race_message_test_proto_msgTypes[0]
	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
	ms.StoreMessageInfo(mi)
}

func (x *MyMessage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MyMessage) ProtoMessage() {}

func (x *MyMessage) ProtoReflect() protoreflect.Message {
	mi := &file_internal_testprotos_race_message_test_proto_msgTypes[0]
	if x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use MyMessage.ProtoReflect.Descriptor instead.
func (*MyMessage) Descriptor() ([]byte, []int) {
	return file_internal_testprotos_race_message_test_proto_rawDescGZIP(), []int{0}
}

func (x *MyMessage) GetI32() int32 {
	if x != nil && x.I32 != nil {
		return *x.I32
	}
	return 0
}

var File_internal_testprotos_race_message_test_proto protoreflect.FileDescriptor

const file_internal_testprotos_race_message_test_proto_rawDesc = "" +
	"\n" +
	"+internal/testprotos/race/message/test.proto\x12\x12goproto.proto.test\"#\n" +
	"\tMyMessage\x12\x10\n" +
	"\x03i32\x18\x01 \x01(\x05R\x03i32*\x04\b\x02\x10\x03B=Z;google.golang.org/protobuf/internal/testprotos/race/messageb\beditionsp\xe8\a"

var (
	file_internal_testprotos_race_message_test_proto_rawDescOnce sync.Once
	file_internal_testprotos_race_message_test_proto_rawDescData []byte
)

func file_internal_testprotos_race_message_test_proto_rawDescGZIP() []byte {
	file_internal_testprotos_race_message_test_proto_rawDescOnce.Do(func() {
		file_internal_testprotos_race_message_test_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_internal_testprotos_race_message_test_proto_rawDesc), len(file_internal_testprotos_race_message_test_proto_rawDesc)))
	})
	return file_internal_testprotos_race_message_test_proto_rawDescData
}

var file_internal_testprotos_race_message_test_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_internal_testprotos_race_message_test_proto_goTypes = []any{
	(*MyMessage)(nil), // 0: goproto.proto.test.MyMessage
}
var file_internal_testprotos_race_message_test_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_internal_testprotos_race_message_test_proto_init() }
func file_internal_testprotos_race_message_test_proto_init() {
	if File_internal_testprotos_race_message_test_proto != nil {
		return
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: unsafe.Slice(unsafe.StringData(file_internal_testprotos_race_message_test_proto_rawDesc), len(file_internal_testprotos_race_message_test_proto_rawDesc)),
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_internal_testprotos_race_message_test_proto_goTypes,
		DependencyIndexes: file_internal_testprotos_race_message_test_proto_depIdxs,
		MessageInfos:      file_internal_testprotos_race_message_test_proto_msgTypes,
	}.Build()
	File_internal_testprotos_race_message_test_proto = out.File
	file_internal_testprotos_race_message_test_proto_goTypes = nil
	file_internal_testprotos_race_message_test_proto_depIdxs = nil
}
