@@ -94,6 +94,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType &Field,
9494 case InfoType::IT_typedef:
9595 case InfoType::IT_concept:
9696 case InfoType::IT_variable:
97+ case InfoType::IT_friend:
9798 Field = IT;
9899 return llvm::Error::success ();
99100 }
@@ -111,6 +112,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId &Field,
111112 case FieldId::F_child_namespace:
112113 case FieldId::F_child_record:
113114 case FieldId::F_concept:
115+ case FieldId::F_friend:
114116 case FieldId::F_default:
115117 Field = F;
116118 return llvm::Error::success ();
@@ -450,6 +452,15 @@ static llvm::Error parseRecord(const Record &R, unsigned ID,
450452 }
451453}
452454
455+ static llvm::Error parseRecord (const Record &R, unsigned ID, StringRef Blob,
456+ FriendInfo *F) {
457+ if (ID == FRIEND_IS_CLASS) {
458+ return decodeRecord (R, F->IsClass , Blob);
459+ }
460+ return llvm::createStringError (llvm::inconvertibleErrorCode (),
461+ " invalid field for Friend" );
462+ }
463+
453464template <typename T> static llvm::Expected<CommentInfo *> getCommentInfo (T I) {
454465 return llvm::createStringError (llvm::inconvertibleErrorCode (),
455466 " invalid type cannot contain CommentInfo" );
@@ -525,6 +536,18 @@ template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) {
525536 return llvm::Error::success ();
526537}
527538
539+ template <> llvm::Error addTypeInfo (FriendInfo *I, FieldTypeInfo &&T) {
540+ if (!I->Params )
541+ I->Params .emplace ();
542+ I->Params ->emplace_back (std::move (T));
543+ return llvm::Error::success ();
544+ }
545+
546+ template <> llvm::Error addTypeInfo (FriendInfo *I, TypeInfo &&T) {
547+ I->ReturnType .emplace (std::move (T));
548+ return llvm::Error::success ();
549+ }
550+
528551template <> llvm::Error addTypeInfo (EnumInfo *I, TypeInfo &&T) {
529552 I->BaseType = std::move (T);
530553 return llvm::Error::success ();
@@ -667,6 +690,16 @@ llvm::Error addReference(ConstraintInfo *I, Reference &&R, FieldId F) {
667690 " ConstraintInfo cannot contain this Reference" );
668691}
669692
693+ template <>
694+ llvm::Error addReference (FriendInfo *Friend, Reference &&R, FieldId F) {
695+ if (F == FieldId::F_friend) {
696+ Friend->Ref = std::move (R);
697+ return llvm::Error::success ();
698+ }
699+ return llvm::createStringError (llvm::inconvertibleErrorCode (),
700+ " Friend cannot contain this Reference" );
701+ }
702+
670703template <typename T, typename ChildInfoType>
671704static void addChild (T I, ChildInfoType &&R) {
672705 llvm::errs () << " invalid child type for info" ;
@@ -700,6 +733,9 @@ template <> void addChild(RecordInfo *I, EnumInfo &&R) {
700733template <> void addChild (RecordInfo *I, TypedefInfo &&R) {
701734 I->Children .Typedefs .emplace_back (std::move (R));
702735}
736+ template <> void addChild (RecordInfo *I, FriendInfo &&R) {
737+ I->Friends .emplace_back (std::move (R));
738+ }
703739
704740// Other types of children:
705741template <> void addChild (EnumInfo *I, EnumValueInfo &&R) {
@@ -741,6 +777,9 @@ template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) {
741777template <> void addTemplate (ConceptInfo *I, TemplateInfo &&P) {
742778 I->Template = std::move (P);
743779}
780+ template <> void addTemplate (FriendInfo *I, TemplateInfo &&P) {
781+ I->Template .emplace (std::move (P));
782+ }
744783
745784// Template specializations go only into template records.
746785template <typename T>
@@ -921,6 +960,10 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
921960 case BI_VAR_BLOCK_ID: {
922961 return handleSubBlock<VarInfo>(ID, I, CreateAddFunc (addChild<T, VarInfo>));
923962 }
963+ case BI_FRIEND_BLOCK_ID: {
964+ return handleSubBlock<FriendInfo>(ID, I,
965+ CreateAddFunc (addChild<T, FriendInfo>));
966+ }
924967 default :
925968 return llvm::createStringError (llvm::inconvertibleErrorCode (),
926969 " invalid subblock type" );
@@ -1032,6 +1075,8 @@ ClangDocBitcodeReader::readBlockToInfo(unsigned ID) {
10321075 return createInfo<FunctionInfo>(ID);
10331076 case BI_VAR_BLOCK_ID:
10341077 return createInfo<VarInfo>(ID);
1078+ case BI_FRIEND_BLOCK_ID:
1079+ return createInfo<FriendInfo>(ID);
10351080 default :
10361081 return llvm::createStringError (llvm::inconvertibleErrorCode (),
10371082 " cannot create info" );
@@ -1072,6 +1117,7 @@ ClangDocBitcodeReader::readBitcode() {
10721117 case BI_TYPEDEF_BLOCK_ID:
10731118 case BI_CONCEPT_BLOCK_ID:
10741119 case BI_VAR_BLOCK_ID:
1120+ case BI_FRIEND_BLOCK_ID:
10751121 case BI_FUNCTION_BLOCK_ID: {
10761122 auto InfoOrErr = readBlockToInfo (ID);
10771123 if (!InfoOrErr)
0 commit comments