jankratochvil updated this revision to Diff 342249.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D101236/new/
https://reviews.llvm.org/D101236
Files:
clang/lib/AST/ASTImporter.cpp
clang/unittests/AST/ASTImporterTest.cpp
Index: clang/unittests/AST/ASTImporterTest.cpp
===================================================================
--- clang/unittests/AST/ASTImporterTest.cpp
+++ clang/unittests/AST/ASTImporterTest.cpp
@@ -6323,6 +6323,105 @@
ToD->getTemplateSpecializationKind());
}
+TEST_P(ASTImporterOptionSpecificTestBase, ImportNoUniqueAddress) {
+ Decl *FromTU = getTuDecl(
+ R"(
+ struct A {};
+ struct B {
+ [[no_unique_address]] A a;
+ };
+ struct C : B {
+ char c;
+ } c;
+ )", Lang_CXX20);
+
+ auto *BFromD = FirstDeclMatcher<CXXRecordDecl>().match(
+ FromTU, cxxRecordDecl(hasName("B")));
+ ASSERT_TRUE(BFromD);
+ auto *BToD = Import(BFromD, Lang_CXX20);
+ EXPECT_TRUE(BToD);
+
+ auto *CFromD = FirstDeclMatcher<CXXRecordDecl>().match(
+ FromTU, cxxRecordDecl(hasName("C")));
+ ASSERT_TRUE(CFromD);
+ auto *CToD = Import(CFromD, Lang_CXX20);
+ EXPECT_TRUE(CToD);
+
+ QualType CFType = FromTU->getASTContext().getRecordType(CFromD);
+ TypeInfo TFI = FromTU->getASTContext().getTypeInfo(CFType);
+ ASSERT_EQ(TFI.Width, 8U);
+ QualType CTType = FromTU->getASTContext().getRecordType(CToD);
+ TypeInfo TTI = FromTU->getASTContext().getTypeInfo(CTType);
+ // Here we test the NoUniqueAddressAttr import.
+ // But the Record definition part is not tested here.
+ ASSERT_EQ(TTI.Width, TFI.Width);
+}
+
+struct LLDBMinimalImport : ASTImporterOptionSpecificTestBase {
+ LLDBMinimalImport() {
+ Creator = [](ASTContext &ToContext, FileManager &ToFileManager,
+ ASTContext &FromContext, FileManager &FromFileManager,
+ bool MinimalImport,
+ const std::shared_ptr<ASTImporterSharedState> &SharedState) {
+ return new ASTImporter(ToContext, ToFileManager, FromContext,
+ FromFileManager, true /*MinimalImport*/,
+ // We use the regular lookup.
+ /*SharedState=*/nullptr);
+ };
+ }
+};
+
+TEST_P(LLDBMinimalImport, LLDBImportNoUniqueAddress) {
+ TranslationUnitDecl *ToTU = getToTuDecl(
+ R"(
+ struct A {};
+ struct B {
+ [[no_unique_address]] A a;
+ };
+ struct C : B {
+ char c;
+ } c;
+ )", Lang_CXX20);
+ auto *ToC = FirstDeclMatcher<CXXRecordDecl>().match(
+ ToTU, cxxRecordDecl(hasName("C")));
+
+ // Set up a stub external storage.
+ ToTU->setHasExternalLexicalStorage(true);
+ // Set up DeclContextBits.HasLazyExternalLexicalLookups to true.
+ ToTU->setMustBuildLookupTable();
+ struct TestExternalASTSource : ExternalASTSource {};
+ ToTU->getASTContext().setExternalSource(new TestExternalASTSource());
+
+ Decl *FromTU = getTuDecl(
+ R"(
+ struct C;
+ )",
+ Lang_CXX20);
+ auto *FromC = FirstDeclMatcher<CXXRecordDecl>().match(
+ FromTU, cxxRecordDecl(hasName("C")));
+ auto *ImportedC = Import(FromC, Lang_CXX20);
+ // The lookup must find the existing class definition in the LinkageSpecDecl.
+ // Then the importer renders the existing and the new decl into one chain.
+ EXPECT_EQ(ImportedC->getCanonicalDecl(), ToC->getCanonicalDecl());
+
+ // Import the definition of the created class.
+ llvm::Error Err = findFromTU(FromC)->Importer->ImportDefinition(ToC);
+ EXPECT_FALSE((bool)Err);
+ consumeError(std::move(Err));
+
+ QualType CTType = ToTU->getASTContext().getRecordType(ToC);
+ TypeInfo TTI = ToTU->getASTContext().getTypeInfo(CTType);
+ fprintf(stderr,"LLDB To Width=%lu\n",TTI.Width);
+#if 0 // getASTRecordLayout(const clang::RecordDecl *) const: Assertion `D && "Cannot get layout of forward declarations!"' failed.
+ QualType CFType = FromTU->getASTContext().getRecordType(FromC);
+ TypeInfo TFI = FromTU->getASTContext().getTypeInfo(CFType);
+ fprintf(stderr,"LLDB From Width=%lu\n",TFI.Width);
+#endif
+ QualType CIType = FromTU->getASTContext().getRecordType(ImportedC);
+ TypeInfo TII = FromTU->getASTContext().getTypeInfo(CIType);
+ fprintf(stderr,"LLDB Imported Width=%lu\n",TII.Width);
+}
+
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,
DefaultTestValuesForRunOptions, );
@@ -6397,5 +6496,8 @@
INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportWithExternalSource,
DefaultTestValuesForRunOptions, );
+INSTANTIATE_TEST_CASE_P(ParameterizedTests, LLDBMinimalImport,
+ DefaultTestValuesForRunOptions, );
+
} // end namespace ast_matchers
} // end namespace clang
Index: clang/lib/AST/ASTImporter.cpp
===================================================================
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -3673,6 +3673,30 @@
D->getInClassInitStyle()))
return ToField;
+ // FieldDecl::isZeroSize may need to check these.
+ if (const Attr *FromAttr = D->getAttr<NoUniqueAddressAttr>()) {
+ if (auto ToAttrOrErr = Importer.Import(FromAttr))
+ ToField->addAttr(*ToAttrOrErr);
+ else
+ return ToAttrOrErr.takeError();
+#if 0
+ RecordType *FromRT =
+ const_cast<RecordType *>(D->getType()->getAs<RecordType>());
+ // Is this field a struct? FieldDecl::isZeroSize will need its definition.
+ if (FromRT) {
+ RecordDecl *FromRD = FromRT->getDecl();
+ RecordType *ToRT =
+ const_cast<RecordType *>(ToField->getType()->getAs<RecordType>());
+ assert(ToRT && "RecordType import has different type");
+ RecordDecl *ToRD = ToRT->getDecl();
+ if (FromRD->isCompleteDefinition() && !ToRD->isCompleteDefinition()) {
+ if (Error Err = ImportDefinition(FromRD, ToRD, IDK_Basic))
+ return std::move(Err);
+ }
+ }
+#endif
+ }
+
ToField->setAccess(D->getAccess());
ToField->setLexicalDeclContext(LexicalDC);
if (ToInitializer)
@@ -8445,6 +8469,8 @@
// Make sure that ImportImpl registered the imported decl.
assert(ImportedDecls.count(FromD) != 0 && "Missing call to MapImported?");
+ // There may have been NoUniqueAddressAttr for FieldDecl::isZeroSize.
+ ToD->dropAttrs();
if (FromD->hasAttrs())
for (const Attr *FromAttr : FromD->getAttrs()) {
auto ToAttrOrErr = Import(FromAttr);
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits