diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp --- a/clang-tools-extra/clang-doc/BitcodeReader.cpp +++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp @@ -368,28 +368,27 @@ } template <> llvm::Expected getCommentInfo(FunctionInfo *I) { - I->Description.emplace_back(); - return &I->Description.back(); + return &I->Description.emplace_back(); } template <> llvm::Expected getCommentInfo(NamespaceInfo *I) { - I->Description.emplace_back(); - return &I->Description.back(); + return &I->Description.emplace_back(); } template <> llvm::Expected getCommentInfo(RecordInfo *I) { - I->Description.emplace_back(); - return &I->Description.back(); + return &I->Description.emplace_back(); } template <> llvm::Expected getCommentInfo(MemberTypeInfo *I) { - I->Description.emplace_back(); - return &I->Description.back(); + return &I->Description.emplace_back(); } template <> llvm::Expected getCommentInfo(EnumInfo *I) { - I->Description.emplace_back(); - return &I->Description.back(); + return &I->Description.emplace_back(); +} + +template <> llvm::Expected getCommentInfo(TypedefInfo *I) { + return &I->Description.emplace_back(); } template <> llvm::Expected getCommentInfo(CommentInfo *I) { diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp b/clang-tools-extra/clang-doc/BitcodeWriter.cpp --- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp +++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp @@ -432,6 +432,8 @@ emitRecord(T.Name, TYPEDEF_NAME); for (const auto &N : T.Namespace) emitBlock(N, FieldId::F_namespace); + for (const auto &CI : T.Description) + emitBlock(CI); if (T.DefLoc) emitRecord(*T.DefLoc, TYPEDEF_DEFLOCATION); emitRecord(T.IsUsing, TYPEDEF_IS_USING); diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h --- a/clang-tools-extra/clang-doc/Representation.h +++ b/clang-tools-extra/clang-doc/Representation.h @@ -365,7 +365,7 @@ // using MyVector = std::vector // False means it's a C-style typedef: // typedef std::vector MyVector; - bool IsUsing; + bool IsUsing = false; }; struct BaseRecordInfo : public RecordInfo { diff --git a/clang-tools-extra/unittests/clang-doc/BitcodeTest.cpp b/clang-tools-extra/unittests/clang-doc/BitcodeTest.cpp --- a/clang-tools-extra/unittests/clang-doc/BitcodeTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/BitcodeTest.cpp @@ -183,11 +183,33 @@ I.Underlying = TypeInfo("unsigned"); I.IsUsing = true; + CommentInfo Top; + Top.Kind = "FullComment"; + + Top.Children.emplace_back(std::make_unique()); + CommentInfo *BlankLine = Top.Children.back().get(); + BlankLine->Kind = "ParagraphComment"; + BlankLine->Children.emplace_back(std::make_unique()); + BlankLine->Children.back()->Kind = "TextComment"; + + I.Description.emplace_back(std::move(Top)); + std::string WriteResult = writeInfo(&I); EXPECT_TRUE(WriteResult.size() > 0); std::vector> ReadResults = readInfo(WriteResult, 1); CheckTypedefInfo(&I, InfoAsTypedef(ReadResults[0].get())); + + // Check one with no IsUsing set, no description, and no definition location. + TypedefInfo I2; + I2.Name = "SomethingElse"; + I2.IsUsing = false; + I2.Underlying = TypeInfo("int"); + + WriteResult = writeInfo(&I2); + EXPECT_TRUE(WriteResult.size() > 0); + ReadResults = readInfo(WriteResult, 1); + CheckTypedefInfo(&I2, InfoAsTypedef(ReadResults[0].get())); } TEST(SerializeTest, emitInfoWithCommentBitcode) {