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())
// 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);
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<TypedefDecl>().match(TU, typedefDecl(hasName("X")));
+ auto *ToD = Import(FromD, Lang_CXX17);
+ ASSERT_TRUE(ToD);
+ ASSERT_EQ(ToD->getAttrs().size(), 1);
+ auto *ToAttr = dyn_cast<AnnotateAttr>(ToD->getAttrs()[0]);
+ ASSERT_TRUE(ToAttr);
+ EXPECT_EQ(ToAttr->getAnnotation(), "A");
+}
+
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions, );