Skip to content

Commit 88e5206

Browse files
committed
Reland [clang][ASTImport] Add support for import of empty records
Patch represents the clang part of changes in D143347 Reviewed By: balazske Differential Revision: https://reviews.llvm.org/D145057 ~~ Huawei RRI, OS Lab
1 parent dc9d2e5 commit 88e5206

File tree

4 files changed

+49
-9
lines changed

4 files changed

+49
-9
lines changed

clang/include/clang/AST/ASTImporter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ class TypeSourceInfo;
258258
FoundDeclsTy findDeclsInToCtx(DeclContext *DC, DeclarationName Name);
259259

260260
void AddToLookupTable(Decl *ToD);
261+
llvm::Error ImportAttrs(Decl *ToD, Decl *FromD);
261262

262263
protected:
263264
/// Can be overwritten by subclasses to implement their own import logic.

clang/include/clang/AST/DeclCXX.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,6 +1165,10 @@ class CXXRecordDecl : public RecordDecl {
11651165
///
11661166
/// \note This does NOT include a check for union-ness.
11671167
bool isEmpty() const { return data().Empty; }
1168+
/// Marks this record as empty. This is used by DWARFASTParserClang
1169+
/// when parsing records with empty fields having [[no_unique_address]]
1170+
/// attribute
1171+
void markEmpty() { data().Empty = true; }
11681172

11691173
void setInitMethod(bool Val) { data().HasInitMethod = Val; }
11701174
bool hasInitMethod() const { return data().HasInitMethod; }

clang/lib/AST/ASTImporter.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3895,6 +3895,12 @@ ExpectedDecl ASTNodeImporter::VisitFieldDecl(FieldDecl *D) {
38953895
D->getInClassInitStyle()))
38963896
return ToField;
38973897

3898+
// We need [[no_unqiue_address]] attributes to be added to FieldDecl, before
3899+
// we add fields in CXXRecordDecl::addedMember, otherwise record will be
3900+
// marked as having non-zero size.
3901+
Err = Importer.ImportAttrs(ToField, D);
3902+
if (Err)
3903+
return std::move(Err);
38983904
ToField->setAccess(D->getAccess());
38993905
ToField->setLexicalDeclContext(LexicalDC);
39003906
if (ToInitializer)
@@ -8981,6 +8987,19 @@ TranslationUnitDecl *ASTImporter::GetFromTU(Decl *ToD) {
89818987
return FromDPos->second->getTranslationUnitDecl();
89828988
}
89838989

8990+
Error ASTImporter::ImportAttrs(Decl *ToD, Decl *FromD) {
8991+
if (!FromD->hasAttrs() || ToD->hasAttrs())
8992+
return Error::success();
8993+
for (const Attr *FromAttr : FromD->getAttrs()) {
8994+
auto ToAttrOrErr = Import(FromAttr);
8995+
if (ToAttrOrErr)
8996+
ToD->addAttr(*ToAttrOrErr);
8997+
else
8998+
return ToAttrOrErr.takeError();
8999+
}
9000+
return Error::success();
9001+
}
9002+
89849003
Expected<Decl *> ASTImporter::Import(Decl *FromD) {
89859004
if (!FromD)
89869005
return nullptr;
@@ -9115,15 +9134,8 @@ Expected<Decl *> ASTImporter::Import(Decl *FromD) {
91159134

91169135
// Make sure that ImportImpl registered the imported decl.
91179136
assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
9118-
9119-
if (FromD->hasAttrs())
9120-
for (const Attr *FromAttr : FromD->getAttrs()) {
9121-
auto ToAttrOrErr = Import(FromAttr);
9122-
if (ToAttrOrErr)
9123-
ToD->addAttr(*ToAttrOrErr);
9124-
else
9125-
return ToAttrOrErr.takeError();
9126-
}
9137+
if (auto Error = ImportAttrs(ToD, FromD))
9138+
return std::move(Error);
91279139

91289140
// Notify subclasses.
91299141
Imported(FromD, ToD);

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8478,6 +8478,29 @@ TEST_P(ASTImporterOptionSpecificTestBase, VaListCpp) {
84788478
ToVaList->getUnderlyingType(), ToBuiltinVaList->getUnderlyingType()));
84798479
}
84808480

8481+
TEST_P(ASTImporterOptionSpecificTestBase,
8482+
ImportDefinitionOfEmptyClassWithNoUniqueAddressField) {
8483+
Decl *FromTU = getTuDecl(
8484+
R"(
8485+
struct B {};
8486+
struct A { B b; };
8487+
)",
8488+
Lang_CXX20);
8489+
8490+
CXXRecordDecl *FromD = FirstDeclMatcher<CXXRecordDecl>().match(
8491+
FromTU, cxxRecordDecl(hasName("A")));
8492+
8493+
for (auto *FD : FromD->fields())
8494+
FD->addAttr(clang::NoUniqueAddressAttr::Create(FromD->getASTContext(),
8495+
clang::SourceRange()));
8496+
FromD->markEmpty();
8497+
8498+
CXXRecordDecl *ToD = Import(FromD, Lang_CXX20);
8499+
EXPECT_TRUE(ToD->isEmpty());
8500+
for (auto *FD : ToD->fields())
8501+
EXPECT_EQ(true, FD->hasAttr<NoUniqueAddressAttr>());
8502+
}
8503+
84818504
INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,
84828505
DefaultTestValuesForRunOptions);
84838506

0 commit comments

Comments
 (0)