balazske updated this revision to Diff 356110.
balazske marked an inline comment as done.
balazske added a comment.
Not using `auto` declarations.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D102492/new/
https://reviews.llvm.org/D102492
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
@@ -3665,6 +3665,52 @@
EXPECT_TRUE(ImportedD->getDefinition());
}
+TEST_P(ImportVariables, ImportBindingDecl) {
+ Decl *From, *To;
+ std::tie(From, To) = getImportedDecl(
+ R"(
+ void declToImport() {
+ int a[2] = {1,2};
+ auto [x1,y1] = a;
+ auto& [x2,y2] = a;
+
+ struct S {
+ mutable int x1 : 2;
+ volatile double y1;
+ };
+ S b;
+ const auto [x3, y3] = b;
+ };
+ )",
+ Lang_CXX17, "", Lang_CXX17);
+
+ TranslationUnitDecl *FromTU = From->getTranslationUnitDecl();
+ auto *FromF = FirstDeclMatcher<FunctionDecl>().match(
+ FromTU, functionDecl(hasName("declToImport")));
+ auto *ToF = Import(FromF, Lang_CXX17);
+ EXPECT_TRUE(ToF);
+
+ auto VerifyImport = [&](llvm::StringRef BindName) {
+ auto *FromB = FirstDeclMatcher<BindingDecl>().match(
+ FromF, bindingDecl(hasName(BindName)));
+ ASSERT_TRUE(FromB);
+ auto *ToB = Import(FromB, Lang_CXX17);
+ EXPECT_TRUE(ToB);
+ EXPECT_EQ(FromB->getBinding() != nullptr, ToB->getBinding() != nullptr);
+ EXPECT_EQ(FromB->getDecomposedDecl() != nullptr,
+ ToB->getDecomposedDecl() != nullptr);
+ EXPECT_EQ(FromB->getHoldingVar() != nullptr,
+ ToB->getHoldingVar() != nullptr);
+ };
+
+ VerifyImport("x1");
+ VerifyImport("y1");
+ VerifyImport("x2");
+ VerifyImport("y2");
+ VerifyImport("x3");
+ VerifyImport("y3");
+}
+
struct ImportClasses : ASTImporterOptionSpecificTestBase {};
TEST_P(ImportClasses, ImportDefinitionWhenProtoIsInNestedToContext) {
Index: clang/lib/AST/ASTImporter.cpp
===================================================================
--- clang/lib/AST/ASTImporter.cpp
+++ clang/lib/AST/ASTImporter.cpp
@@ -481,6 +481,7 @@
ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
+ ExpectedDecl VisitBindingDecl(BindingDecl *D);
ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
@@ -2274,6 +2275,35 @@
return ToD;
}
+ExpectedDecl ASTNodeImporter::VisitBindingDecl(BindingDecl *D) {
+ DeclContext *DC, *LexicalDC;
+ DeclarationName Name;
+ SourceLocation Loc;
+ NamedDecl *ToND;
+ if (Error Err = ImportDeclParts(D, DC, LexicalDC, Name, ToND, Loc))
+ return std::move(Err);
+ if (ToND)
+ return ToND;
+
+ Error Err = Error::success();
+ QualType ToType = importChecked(Err, D->getType());
+ Expr *ToBinding = importChecked(Err, D->getBinding());
+ ValueDecl *ToDecomposedDecl = importChecked(Err, D->getDecomposedDecl());
+ if (Err)
+ return std::move(Err);
+
+ BindingDecl *ToD;
+ if (GetImportedOrCreateDecl(ToD, D, Importer.getToContext(), DC, Loc,
+ Name.getAsIdentifierInfo()))
+ return ToD;
+
+ ToD->setBinding(ToType, ToBinding);
+ ToD->setDecomposedDecl(ToDecomposedDecl);
+ addDeclToContexts(D, ToD);
+
+ return ToD;
+}
+
ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
ExpectedSLoc LocOrErr = import(D->getLocation());
if (!LocOrErr)
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits