[PATCH] D77229: [Analyzer][WIP] Avoid handling of LazyCompundVals in IteratorModeling
Balogh, Ádám via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 27 08:34:37 PDT 2020
baloghadamsoftware added a comment.
In D77229#2005033 <https://reviews.llvm.org/D77229#2005033>, @NoQ wrote:
> > How do we calculate the type then?
>
> Argument expression type + account for value kind (lvalue argument expression means reference parameter, xvalue argument expression mean rvalue reference parameter).
OK, I reid this piece of code instead of storing the type explicitly:
QualType ParamRegion::getValueType() const {
const Expr *Arg = nullptr;
if (const auto *CE = dyn_cast<CallExpr>(OriginExpr)) {
Arg = CE->getArg(Index);
} else if (const auto *CCE = dyn_cast<CXXConstructExpr>(OriginExpr)) {
Arg = CCE->getArg(Index);
} else if (const auto *OCME = dyn_cast<ObjCMessageExpr>(OriginExpr)) {
Arg = OCME->getArg(Index);
} else if (const auto *CNE = dyn_cast<CXXNewExpr>(OriginExpr)) {
Arg = CNE->getPlacementArg(Index);
} else {
// FIXME: Any other kind of `Expr`?
llvm_unreachable("Maybe we forgot something...");
}
assert(Arg);
switch (Arg->getValueKind()) {
case VK_RValue:
return Arg->getType();
case VK_LValue:
return getContext().getLValueReferenceType(Arg->getType());
case VK_XValue:
return getContext().getRValueReferenceType(Arg->getType());
default:
llvm_unreachable("Invalid value kind.");
}
}
This results in the following assertion:
llvm-project/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp:333: clang::ento::ProgramStateRef clang::ento::ExprEngine::createTemporaryRegionIfNeeded(clang::ento::ProgramStateRef, const clang::LocationContext*, const clang::Expr*, const clang::Expr*, const clang::ento::SubRegion**): Assertion `!InitValWithAdjustments.getAs<Loc>() || Loc::isLocType(Result->getType()) || Result->getType()->isMemberPointerType()' failed.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D77229/new/
https://reviews.llvm.org/D77229
More information about the cfe-commits
mailing list