@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType &Field,
9292 case InfoType::IT_default:
9393 case InfoType::IT_enum:
9494 case InfoType::IT_typedef:
95+ case InfoType::IT_concept:
9596 Field = IT;
9697 return llvm::Error::success ();
9798 }
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId &Field,
108109 case FieldId::F_type:
109110 case FieldId::F_child_namespace:
110111 case FieldId::F_child_record:
112+ case FieldId::F_concept:
111113 case FieldId::F_default:
112114 Field = F;
113115 return llvm::Error::success ();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned ID,
391393 " invalid field for TemplateParamInfo" );
392394}
393395
396+ static llvm::Error parseRecord (const Record &R, unsigned ID,
397+ llvm::StringRef Blob, ConceptInfo *I) {
398+ switch (ID) {
399+ case CONCEPT_USR:
400+ return decodeRecord (R, I->USR , Blob);
401+ case CONCEPT_NAME:
402+ return decodeRecord (R, I->Name , Blob);
403+ case CONCEPT_IS_TYPE:
404+ return decodeRecord (R, I->IsType , Blob);
405+ case CONCEPT_CONSTRAINT_EXPRESSION:
406+ return decodeRecord (R, I->ConstraintExpression , Blob);
407+ }
408+ llvm_unreachable (" invalid field for ConceptInfo" );
409+ }
410+
411+ static llvm::Error parseRecord (const Record &R, unsigned ID,
412+ llvm::StringRef Blob, ConstraintInfo *I) {
413+ if (ID == CONSTRAINT_EXPRESSION)
414+ return decodeRecord (R, I->Expression , Blob);
415+ return llvm::createStringError (llvm::inconvertibleErrorCode (),
416+ " invalid field for ConstraintInfo" );
417+ }
418+
394419template <typename T> static llvm::Expected<CommentInfo *> getCommentInfo (T I) {
395420 return llvm::createStringError (llvm::inconvertibleErrorCode (),
396421 " invalid type cannot contain CommentInfo" );
@@ -429,6 +454,10 @@ template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
429454 return I->Children .back ().get ();
430455}
431456
457+ template <> llvm::Expected<CommentInfo *> getCommentInfo (ConceptInfo *I) {
458+ return &I->Description .emplace_back ();
459+ }
460+
432461// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
433462// the parent block to set it. The template specializations define what to do
434463// for each supported parent block.
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) {
584613 }
585614}
586615
616+ template <>
617+ llvm::Error addReference (ConstraintInfo *I, Reference &&R, FieldId F) {
618+ switch (F) {
619+ case FieldId::F_concept:
620+ I->ConceptRef = std::move (R);
621+ return llvm::Error::success ();
622+ default :
623+ return llvm::createStringError (llvm::inconvertibleErrorCode (),
624+ " invalid type cannot contain Reference" );
625+ }
626+ }
627+
587628template <typename T, typename ChildInfoType>
588629static void addChild (T I, ChildInfoType &&R) {
589630 llvm::errs () << " invalid child type for info" ;
@@ -600,6 +641,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
600641template <> void addChild (NamespaceInfo *I, TypedefInfo &&R) {
601642 I->Children .Typedefs .emplace_back (std::move (R));
602643}
644+ template <> void addChild (NamespaceInfo *I, ConceptInfo &&R) {
645+ I->Children .Concepts .emplace_back (std::move (R));
646+ }
603647
604648// Record children:
605649template <> void addChild (RecordInfo *I, FunctionInfo &&R) {
@@ -649,6 +693,9 @@ template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) {
649693template <> void addTemplate (FunctionInfo *I, TemplateInfo &&P) {
650694 I->Template .emplace (std::move (P));
651695}
696+ template <> void addTemplate (ConceptInfo *I, TemplateInfo &&P) {
697+ I->Template = std::move (P);
698+ }
652699
653700// Template specializations go only into template records.
654701template <typename T>
@@ -662,6 +709,14 @@ void addTemplateSpecialization(TemplateInfo *I,
662709 I->Specialization .emplace (std::move (TSI));
663710}
664711
712+ template <typename T> static void addConstraint (T I, ConstraintInfo &&C) {
713+ llvm::errs () << " invalid container for constraint info" ;
714+ exit (1 );
715+ }
716+ template <> void addConstraint (TemplateInfo *I, ConstraintInfo &&C) {
717+ I->Constraints .emplace_back (std::move (C));
718+ }
719+
665720// Read records from bitcode into a given info.
666721template <typename T>
667722llvm::Error ClangDocBitcodeReader::readRecord (unsigned ID, T I) {
@@ -817,6 +872,20 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
817872 addChild (I, std::move (TI));
818873 return llvm::Error::success ();
819874 }
875+ case BI_CONSTRAINT_BLOCK_ID: {
876+ ConstraintInfo CI;
877+ if (auto Err = readBlock (ID, &CI))
878+ return Err;
879+ addConstraint (I, std::move (CI));
880+ return llvm::Error::success ();
881+ }
882+ case BI_CONCEPT_BLOCK_ID: {
883+ ConceptInfo CI;
884+ if (auto Err = readBlock (ID, &CI))
885+ return Err;
886+ addChild (I, std::move (CI));
887+ return llvm::Error::success ();
888+ }
820889 default :
821890 return llvm::createStringError (llvm::inconvertibleErrorCode (),
822891 " invalid subblock type" );
@@ -922,6 +991,8 @@ ClangDocBitcodeReader::readBlockToInfo(unsigned ID) {
922991 return createInfo<EnumInfo>(ID);
923992 case BI_TYPEDEF_BLOCK_ID:
924993 return createInfo<TypedefInfo>(ID);
994+ case BI_CONCEPT_BLOCK_ID:
995+ return createInfo<ConceptInfo>(ID);
925996 case BI_FUNCTION_BLOCK_ID:
926997 return createInfo<FunctionInfo>(ID);
927998 default :
@@ -962,6 +1033,7 @@ ClangDocBitcodeReader::readBitcode() {
9621033 case BI_RECORD_BLOCK_ID:
9631034 case BI_ENUM_BLOCK_ID:
9641035 case BI_TYPEDEF_BLOCK_ID:
1036+ case BI_CONCEPT_BLOCK_ID:
9651037 case BI_FUNCTION_BLOCK_ID: {
9661038 auto InfoOrErr = readBlockToInfo (ID);
9671039 if (!InfoOrErr)
0 commit comments