[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
diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp
index d39b985f..fa8b3c7 100644
--- a/clang/lib/AST/ASTImporter.cpp
+++ b/clang/lib/AST/ASTImporter.cpp
@@ -6817,9 +6817,9 @@
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 @@
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;