summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Marton <martongabesz@gmail.com>2018-09-03 13:10:53 +0000
committerGabor Marton <martongabesz@gmail.com>2018-09-03 13:10:53 +0000
commita20ce60e48c2a60f9747dac0f042e9bf98f04400 (patch)
treeb6a0d37e097f2aff6d7779ce53850d532f43461b
parentaa75dd128c1724c5c4b701cfecc60463449db162 (diff)
downloadbcm5719-llvm-a20ce60e48c2a60f9747dac0f042e9bf98f04400.tar.gz
bcm5719-llvm-a20ce60e48c2a60f9747dac0f042e9bf98f04400.zip
[ASTImporter] Merge ExprBits
Summary: Some `Expr` classes set up default values for the `ExprBits` of `Stmt`. These default values are then overwritten by the parser sometimes. One example is `InitListExpr` which sets the value kind to be an rvalue in the ctor. However, this bit may change after the `InitListExpr` is created. There may be other expressions similar to `InitListExpr` in this sense, thus the safest solution is to copy the expression bits. The lack of copying `ExprBits` causes an assertion in the analyzer engine in a specific case: Since the value kind is not imported, the analyzer engine believes that the given InitListExpr is an rvalue, thus it creates a nonloc::CompoundVal instead of creating memory region (as in case of an lvalue reference). Reviewers: a_sidorin, r.stahl, xazax.hun, a.sidorin Subscribers: rnkovacs, dkrupp, cfe-commits Differential Revision: https://reviews.llvm.org/D51533 llvm-svn: 341316
-rw-r--r--clang/lib/AST/ASTImporter.cpp17
-rw-r--r--clang/unittests/AST/ASTImporterTest.cpp19
2 files changed, 34 insertions, 2 deletions
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index d39b985f28b..fa8b3c739a2 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -6817,9 +6817,9 @@ Expr *ASTNodeImporter::VisitInitListExpr(InitListExpr *ILE) {
To->setSyntacticForm(ToSyntForm);
}
+ // Copy InitListExprBitfields, which are not handled in the ctor of
+ // InitListExpr.
To->sawArrayRangeDesignator(ILE->hadArrayRangeDesignator());
- To->setValueDependent(ILE->isValueDependent());
- To->setInstantiationDependent(ILE->isInstantiationDependent());
return To;
}
@@ -7164,6 +7164,19 @@ Stmt *ASTImporter::Import(Stmt *FromS) {
if (!ToS)
return nullptr;
+ if (auto *ToE = dyn_cast<Expr>(ToS)) {
+ auto *FromE = cast<Expr>(FromS);
+ // Copy ExprBitfields, which may not be handled in Expr subclasses
+ // constructors.
+ ToE->setValueKind(FromE->getValueKind());
+ ToE->setObjectKind(FromE->getObjectKind());
+ ToE->setTypeDependent(FromE->isTypeDependent());
+ ToE->setValueDependent(FromE->isValueDependent());
+ ToE->setInstantiationDependent(FromE->isInstantiationDependent());
+ ToE->setContainsUnexpandedParameterPack(
+ FromE->containsUnexpandedParameterPack());
+ }
+
// Record the imported declaration.
ImportedStmts[FromS] = ToS;
return ToS;
diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp
index c36af16df55..96a8d43cdf1 100644
--- a/clang/unittests/AST/ASTImporterTest.cpp
+++ b/clang/unittests/AST/ASTImporterTest.cpp
@@ -3225,6 +3225,25 @@ TEST_P(ASTImporterTestBase, ClassTemplateFullAndPartialSpecsShouldNotBeMixed) {
unless(classTemplatePartialSpecializationDecl()))));
}
+TEST_P(ASTImporterTestBase, InitListExprValueKindShouldBeImported) {
+ Decl *TU = getTuDecl(
+ R"(
+ const int &init();
+ void foo() { const int &a{init()}; }
+ )", Lang_CXX11, "input0.cc");
+ auto *FromD = FirstDeclMatcher<VarDecl>().match(TU, varDecl(hasName("a")));
+ ASSERT_TRUE(FromD->getAnyInitializer());
+ auto *InitExpr = FromD->getAnyInitializer();
+ ASSERT_TRUE(InitExpr);
+ ASSERT_TRUE(InitExpr->isGLValue());
+
+ auto *ToD = Import(FromD, Lang_CXX11);
+ EXPECT_TRUE(ToD);
+ auto *ToInitExpr = cast<VarDecl>(ToD)->getAnyInitializer();
+ EXPECT_TRUE(ToInitExpr);
+ EXPECT_TRUE(ToInitExpr->isGLValue());
+}
+
struct DeclContextTest : ASTImporterTestBase {};
TEST_P(DeclContextTest, removeDeclOfClassTemplateSpecialization) {
OpenPOWER on IntegriCloud