[clang][AST] Add support for BindingDecl to ASTImporter.

Reviewed By: martong

Differential Revision: https://reviews.llvm.org/D102492
This commit is contained in:
Balázs Kéri 2021-07-02 09:08:54 +02:00
parent 26e1553a10
commit a27a17f883
2 changed files with 76 additions and 0 deletions

View File

@ -496,6 +496,7 @@ namespace clang {
ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D); ExpectedDecl VisitAccessSpecDecl(AccessSpecDecl *D);
ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D); ExpectedDecl VisitStaticAssertDecl(StaticAssertDecl *D);
ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D); ExpectedDecl VisitTranslationUnitDecl(TranslationUnitDecl *D);
ExpectedDecl VisitBindingDecl(BindingDecl *D);
ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D); ExpectedDecl VisitNamespaceDecl(NamespaceDecl *D);
ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D); ExpectedDecl VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias); ExpectedDecl VisitTypedefNameDecl(TypedefNameDecl *D, bool IsAlias);
@ -2291,6 +2292,35 @@ ExpectedDecl ASTNodeImporter::VisitTranslationUnitDecl(TranslationUnitDecl *D) {
return ToD; 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) { ExpectedDecl ASTNodeImporter::VisitAccessSpecDecl(AccessSpecDecl *D) {
ExpectedSLoc LocOrErr = import(D->getLocation()); ExpectedSLoc LocOrErr = import(D->getLocation());
if (!LocOrErr) if (!LocOrErr)

View File

@ -3679,6 +3679,52 @@ TEST_P(ImportVariables, InitAndDefinitionAreInTheFromContext) {
EXPECT_TRUE(ImportedD->getDefinition()); 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 {}; struct ImportClasses : ASTImporterOptionSpecificTestBase {};
TEST_P(ImportClasses, ImportDefinitionWhenProtoIsInNestedToContext) { TEST_P(ImportClasses, ImportDefinitionWhenProtoIsInNestedToContext) {