diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -8094,8 +8094,6 @@ return ToTOrErr.takeError(); } To->setInherited(From->isInherited()); - To->setPackExpansion(From->isPackExpansion()); - To->setImplicit(From->isImplicit()); ToAttr = To; break; } @@ -8106,8 +8104,11 @@ ToAttr->setRange(ToRange); break; } + ToAttr->setAttributeSpellingListIndex( + FromAttr->getAttributeSpellingListIndex()); + ToAttr->setPackExpansion(FromAttr->isPackExpansion()); + ToAttr->setImplicit(FromAttr->isImplicit()); assert(ToAttr && "Attribute should be created."); - return ToAttr; } diff --git a/clang/test/ASTMerge/attr/Inputs/RestrictAttr.cpp b/clang/test/ASTMerge/attr/Inputs/RestrictAttr.cpp new file mode 100644 --- /dev/null +++ b/clang/test/ASTMerge/attr/Inputs/RestrictAttr.cpp @@ -0,0 +1,2 @@ +void *foo(unsigned, unsigned) +__attribute__((__malloc__)); diff --git a/clang/test/ASTMerge/attr/testRestrictAttr.cpp b/clang/test/ASTMerge/attr/testRestrictAttr.cpp new file mode 100644 --- /dev/null +++ b/clang/test/ASTMerge/attr/testRestrictAttr.cpp @@ -0,0 +1,2 @@ +// RUN: %clang -x c++-header -o %t.a.ast %S/Inputs/RestrictAttr.cpp +// RUN: %clang_cc1 -x c++ -ast-merge %t.a.ast /dev/null -ast-dump diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -5767,6 +5767,31 @@ EXPECT_TRUE(ToA); } +TEST_P(ASTImporterOptionSpecificTestBase, ImportRestrictAttr) { + Decl *FromTU = getTuDecl( + R"( + void *foo(unsigned, unsigned) + __attribute__((__malloc__)); + )", + Lang_CXX03, "input.cc"); + auto *FromD = FirstDeclMatcher().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(); + auto *ToAttr = ToD->getAttr(); + 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()); +} + template auto ExtendWithOptions(const T &Values, const std::vector &Args) { auto Copy = Values;