// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_weak.proto

package test

import (
	proto "github.com/golang/protobuf/proto"
	protoapi "github.com/golang/protobuf/protoapi"
	protoreflect "github.com/golang/protobuf/v2/reflect/protoreflect"
	protoimpl "github.com/golang/protobuf/v2/runtime/protoimpl"
	reflect "reflect"
)

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type WeakImportMessage struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *WeakImportMessage) ProtoReflect() protoreflect.Message {
	return xxx_File_test_weak_proto_messageTypes[0].MessageOf(m)
}
func (m *WeakImportMessage) Reset()         { *m = WeakImportMessage{} }
func (m *WeakImportMessage) String() string { return proto.CompactTextString(m) }
func (*WeakImportMessage) ProtoMessage()    {}
func (*WeakImportMessage) Descriptor() ([]byte, []int) {
	return xxx_File_test_weak_proto_rawdesc_gzipped, []int{0}
}

func (m *WeakImportMessage) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_WeakImportMessage.Unmarshal(m, b)
}
func (m *WeakImportMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_WeakImportMessage.Marshal(b, m, deterministic)
}
func (m *WeakImportMessage) XXX_Merge(src proto.Message) {
	xxx_messageInfo_WeakImportMessage.Merge(m, src)
}
func (m *WeakImportMessage) XXX_Size() int {
	return xxx_messageInfo_WeakImportMessage.Size(m)
}
func (m *WeakImportMessage) XXX_DiscardUnknown() {
	xxx_messageInfo_WeakImportMessage.DiscardUnknown(m)
}

var xxx_messageInfo_WeakImportMessage proto.InternalMessageInfo

func init() {
	proto.RegisterFile("test_weak.proto", xxx_File_test_weak_proto_rawdesc_gzipped)
	proto.RegisterType((*WeakImportMessage)(nil), "goproto.proto.test.WeakImportMessage")
}

var xxx_File_test_weak_proto_rawdesc = []byte{
	// 116 bytes of the wire-encoded FileDescriptorProto
	0x0a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x77, 0x65, 0x61, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x12, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x22, 0x13, 0x0a, 0x11, 0x57, 0x65, 0x61, 0x6b, 0x49, 0x6d, 0x70,
	0x6f, 0x72, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69,
	0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x6e, 0x74, 0x65,
	0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f,
	0x74, 0x65, 0x73, 0x74,
}

var xxx_File_test_weak_proto_rawdesc_gzipped = protoapi.CompressGZIP(xxx_File_test_weak_proto_rawdesc)

const _ = protoimpl.EnforceVersion(protoimpl.Version - 0)

var File_test_weak_proto protoreflect.FileDescriptor

var xxx_File_test_weak_proto_messageTypes [1]protoimpl.MessageType
var xxx_File_test_weak_proto_goTypes = []interface{}{
	(*WeakImportMessage)(nil), // 0: goproto.proto.test.WeakImportMessage
}
var xxx_File_test_weak_proto_depIdxs = []int32{}

func init() {
	var messageTypes [1]protoreflect.MessageType
	File_test_weak_proto = protoimpl.FileBuilder{
		RawDescriptor:      xxx_File_test_weak_proto_rawdesc,
		GoTypes:            xxx_File_test_weak_proto_goTypes,
		DependencyIndexes:  xxx_File_test_weak_proto_depIdxs,
		MessageOutputTypes: messageTypes[:],
	}.Init()
	messageGoTypes := xxx_File_test_weak_proto_goTypes[0:][:1]
	for i, mt := range messageTypes[:] {
		xxx_File_test_weak_proto_messageTypes[i].GoType = reflect.TypeOf(messageGoTypes[i])
		xxx_File_test_weak_proto_messageTypes[i].PBType = mt
	}
	xxx_File_test_weak_proto_goTypes = nil
	xxx_File_test_weak_proto_depIdxs = nil
}
