@@ -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