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 @@ -264,16 +264,6 @@ void InitializeImportedDecl(Decl *FromD, Decl *ToD) { ToD->IdentifierNamespace = FromD->IdentifierNamespace; - if (FromD->hasAttrs()) - for (const Attr *FromAttr : FromD->getAttrs()) { - // FIXME: Return of the error here is not possible until store of - // import errors is implemented. - auto ToAttrOrErr = import(FromAttr); - if (ToAttrOrErr) - ToD->addAttr(*ToAttrOrErr); - else - llvm::consumeError(ToAttrOrErr.takeError()); - } if (FromD->isUsed()) ToD->setIsUsed(); if (FromD->isImplicit()) @@ -8328,6 +8318,15 @@ // Make sure that ImportImpl registered the imported decl. assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?"); + if (FromD->hasAttrs()) + for (const Attr *FromAttr : FromD->getAttrs()) { + auto ToAttrOrErr = Import(FromAttr); + if (ToAttrOrErr) + ToD->addAttr(*ToAttrOrErr); + else + return ToAttrOrErr.takeError(); + } + // Notify subclasses. Imported(FromD, ToD); 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 @@ -6084,6 +6084,24 @@ INSTANTIATE_TEST_CASE_P(ParameterizedTests, CTAD, DefaultTestValuesForRunOptions, ); +TEST_P(ASTImporterOptionSpecificTestBase, TypedefWithAttribute) { + Decl *TU = getTuDecl( + R"( + namespace N { + typedef int X __attribute__((annotate("A"))); + } + )", + Lang_CXX17, "input.cc"); + auto *FromD = + FirstDeclMatcher().match(TU, typedefDecl(hasName("X"))); + auto *ToD = Import(FromD, Lang_CXX17); + ASSERT_TRUE(ToD); + ASSERT_EQ(ToD->getAttrs().size(), 1); + auto *ToAttr = dyn_cast(ToD->getAttrs()[0]); + ASSERT_TRUE(ToAttr); + EXPECT_EQ(ToAttr->getAnnotation(), "A"); +} + INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest, DefaultTestValuesForRunOptions, );