This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. martong marked an inline comment as done. Closed by commit rGdd965711c9f0: [ASTImporter] Fix crash caused by unimported type of FromatAttr (authored by martong).
Changed prior to commit: https://reviews.llvm.org/D89319?vs=297854&id=298120#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D89319/new/ https://reviews.llvm.org/D89319 Files: clang/lib/AST/ASTImporter.cpp clang/test/ASTMerge/attr/Inputs/FormatAttr.cpp clang/test/ASTMerge/attr/testFormatAttr.cpp clang/unittests/AST/ASTImporterTest.cpp Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -5767,6 +5767,31 @@ EXPECT_TRUE(ToA); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportFormatAttr) { + Decl *FromTU = getTuDecl( + R"( + int foo(const char * fmt, ...) + __attribute__ ((__format__ (__scanf__, 1, 2))); + )", + Lang_CXX03, "input.cc"); + auto *FromD = FirstDeclMatcher<FunctionDecl>().match( + FromTU, functionDecl(hasName("foo"))); + ASSERT_TRUE(FromD); + + auto *ToD = Import(FromD, Lang_CXX03); + ASSERT_TRUE(ToD); + ToD->dump(); // Should not crash! + + auto *FromAttr = FromD->getAttr<FormatAttr>(); + auto *ToAttr = ToD->getAttr<FormatAttr>(); + EXPECT_EQ(FromAttr->isInherited(), ToAttr->isInherited()); + EXPECT_EQ(FromAttr->isPackExpansion(), ToAttr->isPackExpansion()); + EXPECT_EQ(FromAttr->isImplicit(), ToAttr->isImplicit()); + EXPECT_EQ(FromAttr->getSyntax(), ToAttr->getSyntax()); + EXPECT_EQ(FromAttr->getAttributeSpellingListIndex(), + ToAttr->getAttributeSpellingListIndex()); + EXPECT_EQ(FromAttr->getType()->getName(), ToAttr->getType()->getName()); +} template <typename T> auto ExtendWithOptions(const T &Values, const std::vector<std::string> &Args) { auto Copy = Values; Index: clang/test/ASTMerge/attr/testFormatAttr.cpp =================================================================== --- /dev/null +++ clang/test/ASTMerge/attr/testFormatAttr.cpp @@ -0,0 +1,2 @@ +// RUN: %clang -x c++-header -o %t.a.ast %S/Inputs/FormatAttr.cpp +// RUN: %clang_cc1 -x c++ -ast-merge %t.a.ast /dev/null -ast-dump Index: clang/test/ASTMerge/attr/Inputs/FormatAttr.cpp =================================================================== --- /dev/null +++ clang/test/ASTMerge/attr/Inputs/FormatAttr.cpp @@ -0,0 +1 @@ +int foo(const char *fmt, ...) __attribute__((__format__(__scanf__, 1, 2))); Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -8100,6 +8100,16 @@ ToAttr = To; break; } + case attr::Format: { + const auto *From = cast<FormatAttr>(FromAttr); + FormatAttr *To; + IdentifierInfo *ToAttrType = Import(From->getType()); + To = FormatAttr::Create(ToContext, ToAttrType, From->getFormatIdx(), + From->getFirstArg(), ToRange, From->getSyntax()); + To->setInherited(From->isInherited()); + ToAttr = To; + break; + } default: // FIXME: 'clone' copies every member but some of them should be imported. // Handle other Attrs that have parameters that should be imported.
Index: clang/unittests/AST/ASTImporterTest.cpp =================================================================== --- clang/unittests/AST/ASTImporterTest.cpp +++ clang/unittests/AST/ASTImporterTest.cpp @@ -5767,6 +5767,31 @@ EXPECT_TRUE(ToA); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportFormatAttr) { + Decl *FromTU = getTuDecl( + R"( + int foo(const char * fmt, ...) + __attribute__ ((__format__ (__scanf__, 1, 2))); + )", + Lang_CXX03, "input.cc"); + auto *FromD = FirstDeclMatcher<FunctionDecl>().match( + FromTU, functionDecl(hasName("foo"))); + ASSERT_TRUE(FromD); + + auto *ToD = Import(FromD, Lang_CXX03); + ASSERT_TRUE(ToD); + ToD->dump(); // Should not crash! + + auto *FromAttr = FromD->getAttr<FormatAttr>(); + auto *ToAttr = ToD->getAttr<FormatAttr>(); + EXPECT_EQ(FromAttr->isInherited(), ToAttr->isInherited()); + EXPECT_EQ(FromAttr->isPackExpansion(), ToAttr->isPackExpansion()); + EXPECT_EQ(FromAttr->isImplicit(), ToAttr->isImplicit()); + EXPECT_EQ(FromAttr->getSyntax(), ToAttr->getSyntax()); + EXPECT_EQ(FromAttr->getAttributeSpellingListIndex(), + ToAttr->getAttributeSpellingListIndex()); + EXPECT_EQ(FromAttr->getType()->getName(), ToAttr->getType()->getName()); +} template <typename T> auto ExtendWithOptions(const T &Values, const std::vector<std::string> &Args) { auto Copy = Values; Index: clang/test/ASTMerge/attr/testFormatAttr.cpp =================================================================== --- /dev/null +++ clang/test/ASTMerge/attr/testFormatAttr.cpp @@ -0,0 +1,2 @@ +// RUN: %clang -x c++-header -o %t.a.ast %S/Inputs/FormatAttr.cpp +// RUN: %clang_cc1 -x c++ -ast-merge %t.a.ast /dev/null -ast-dump Index: clang/test/ASTMerge/attr/Inputs/FormatAttr.cpp =================================================================== --- /dev/null +++ clang/test/ASTMerge/attr/Inputs/FormatAttr.cpp @@ -0,0 +1 @@ +int foo(const char *fmt, ...) __attribute__((__format__(__scanf__, 1, 2))); Index: clang/lib/AST/ASTImporter.cpp =================================================================== --- clang/lib/AST/ASTImporter.cpp +++ clang/lib/AST/ASTImporter.cpp @@ -8100,6 +8100,16 @@ ToAttr = To; break; } + case attr::Format: { + const auto *From = cast<FormatAttr>(FromAttr); + FormatAttr *To; + IdentifierInfo *ToAttrType = Import(From->getType()); + To = FormatAttr::Create(ToContext, ToAttrType, From->getFormatIdx(), + From->getFirstArg(), ToRange, From->getSyntax()); + To->setInherited(From->isInherited()); + ToAttr = To; + break; + } default: // FIXME: 'clone' copies every member but some of them should be imported. // Handle other Attrs that have parameters that should be imported.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits