@@ -92,6 +92,7 @@ static llvm::Error decodeRecord(const Record &R, InfoType &Field,
92
92
case InfoType::IT_default:
93
93
case InfoType::IT_enum:
94
94
case InfoType::IT_typedef:
95
+ case InfoType::IT_concept:
95
96
Field = IT;
96
97
return llvm::Error::success ();
97
98
}
@@ -108,6 +109,7 @@ static llvm::Error decodeRecord(const Record &R, FieldId &Field,
108
109
case FieldId::F_type:
109
110
case FieldId::F_child_namespace:
110
111
case FieldId::F_child_record:
112
+ case FieldId::F_concept:
111
113
case FieldId::F_default:
112
114
Field = F;
113
115
return llvm::Error::success ();
@@ -391,6 +393,29 @@ static llvm::Error parseRecord(const Record &R, unsigned ID,
391
393
" invalid field for TemplateParamInfo" );
392
394
}
393
395
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
+
394
419
template <typename T> static llvm::Expected<CommentInfo *> getCommentInfo (T I) {
395
420
return llvm::createStringError (llvm::inconvertibleErrorCode (),
396
421
" invalid type cannot contain CommentInfo" );
@@ -429,6 +454,10 @@ template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
429
454
return I->Children .back ().get ();
430
455
}
431
456
457
+ template <> llvm::Expected<CommentInfo *> getCommentInfo (ConceptInfo *I) {
458
+ return &I->Description .emplace_back ();
459
+ }
460
+
432
461
// When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
433
462
// the parent block to set it. The template specializations define what to do
434
463
// for each supported parent block.
@@ -584,6 +613,18 @@ template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) {
584
613
}
585
614
}
586
615
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
+
587
628
template <typename T, typename ChildInfoType>
588
629
static void addChild (T I, ChildInfoType &&R) {
589
630
llvm::errs () << " invalid child type for info" ;
@@ -600,6 +641,9 @@ template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
600
641
template <> void addChild (NamespaceInfo *I, TypedefInfo &&R) {
601
642
I->Children .Typedefs .emplace_back (std::move (R));
602
643
}
644
+ template <> void addChild (NamespaceInfo *I, ConceptInfo &&R) {
645
+ I->Children .Concepts .emplace_back (std::move (R));
646
+ }
603
647
604
648
// Record children:
605
649
template <> void addChild (RecordInfo *I, FunctionInfo &&R) {
@@ -649,6 +693,9 @@ template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) {
649
693
template <> void addTemplate (FunctionInfo *I, TemplateInfo &&P) {
650
694
I->Template .emplace (std::move (P));
651
695
}
696
+ template <> void addTemplate (ConceptInfo *I, TemplateInfo &&P) {
697
+ I->Template = std::move (P);
698
+ }
652
699
653
700
// Template specializations go only into template records.
654
701
template <typename T>
@@ -662,6 +709,14 @@ void addTemplateSpecialization(TemplateInfo *I,
662
709
I->Specialization .emplace (std::move (TSI));
663
710
}
664
711
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
+
665
720
// Read records from bitcode into a given info.
666
721
template <typename T>
667
722
llvm::Error ClangDocBitcodeReader::readRecord (unsigned ID, T I) {
@@ -817,6 +872,20 @@ llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
817
872
addChild (I, std::move (TI));
818
873
return llvm::Error::success ();
819
874
}
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
+ }
820
889
default :
821
890
return llvm::createStringError (llvm::inconvertibleErrorCode (),
822
891
" invalid subblock type" );
@@ -922,6 +991,8 @@ ClangDocBitcodeReader::readBlockToInfo(unsigned ID) {
922
991
return createInfo<EnumInfo>(ID);
923
992
case BI_TYPEDEF_BLOCK_ID:
924
993
return createInfo<TypedefInfo>(ID);
994
+ case BI_CONCEPT_BLOCK_ID:
995
+ return createInfo<ConceptInfo>(ID);
925
996
case BI_FUNCTION_BLOCK_ID:
926
997
return createInfo<FunctionInfo>(ID);
927
998
default :
@@ -962,6 +1033,7 @@ ClangDocBitcodeReader::readBitcode() {
962
1033
case BI_RECORD_BLOCK_ID:
963
1034
case BI_ENUM_BLOCK_ID:
964
1035
case BI_TYPEDEF_BLOCK_ID:
1036
+ case BI_CONCEPT_BLOCK_ID:
965
1037
case BI_FUNCTION_BLOCK_ID: {
966
1038
auto InfoOrErr = readBlockToInfo (ID);
967
1039
if (!InfoOrErr)
0 commit comments