FoundDeclsTy findDeclsInToCtx(DeclContext *DC, DeclarationName Name);
void AddToLookupTable(Decl *ToD);
- llvm::Error ImportAttrs(Decl *ToD, Decl *FromD);
protected:
/// Can be overwritten by subclasses to implement their own import logic.
///
/// \note This does NOT include a check for union-ness.
bool isEmpty() const { return data().Empty; }
- /// Marks this record as empty. This is used by DWARFASTParserClang
- /// when parsing records with empty fields having [[no_unique_address]]
- /// attribute
- void markEmpty() { data().Empty = true; }
void setInitMethod(bool Val) { data().HasInitMethod = Val; }
bool hasInitMethod() const { return data().HasInitMethod; }
D->getInClassInitStyle()))
return ToField;
- // We need [[no_unqiue_address]] attributes to be added to FieldDecl, before
- // we add fields in CXXRecordDecl::addedMember, otherwise record will be
- // marked as having non-zero size.
- Err = Importer.ImportAttrs(ToField, D);
- if (Err)
- return std::move(Err);
ToField->setAccess(D->getAccess());
ToField->setLexicalDeclContext(LexicalDC);
if (ToInitializer)
return FromDPos->second->getTranslationUnitDecl();
}
-Error ASTImporter::ImportAttrs(Decl *ToD, Decl *FromD) {
- if (!FromD->hasAttrs() || ToD->hasAttrs())
- return Error::success();
- for (const Attr *FromAttr : FromD->getAttrs()) {
- auto ToAttrOrErr = Import(FromAttr);
- if (ToAttrOrErr)
- ToD->addAttr(*ToAttrOrErr);
- else
- return ToAttrOrErr.takeError();
- }
- return Error::success();
-}
-
Expected<Decl *> ASTImporter::Import(Decl *FromD) {
if (!FromD)
return nullptr;
// Make sure that ImportImpl registered the imported decl.
assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
- if (auto Error = ImportAttrs(ToD, FromD))
- return std::move(Error);
+
+ 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);
ToVaList->getUnderlyingType(), ToBuiltinVaList->getUnderlyingType()));
}
-TEST_P(ASTImporterOptionSpecificTestBase,
- ImportDefinitionOfEmptyClassWithNoUniqueAddressField) {
- Decl *FromTU = getTuDecl(
- R"(
- struct B {};
- struct A { B b; };
- )",
- Lang_CXX20);
-
- CXXRecordDecl *FromD = FirstDeclMatcher<CXXRecordDecl>().match(
- FromTU, cxxRecordDecl(hasName("A")));
-
- for (auto *FD : FromD->fields())
- FD->addAttr(clang::NoUniqueAddressAttr::Create(FromD->getASTContext(),
- clang::SourceRange()));
- FromD->markEmpty();
-
- CXXRecordDecl *ToD = cast<CXXRecordDecl>(Import(FromD, Lang_CXX20));
- EXPECT_EQ(true, ToD->isEmpty());
- for (auto *FD : ToD->fields())
- EXPECT_EQ(true, FD->hasAttr<NoUniqueAddressAttr>());
-}
-
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions);