mboehme updated this revision to Diff 544335.
mboehme added a comment.
Rebase to head
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D155921/new/
https://reviews.llvm.org/D155921
Files:
clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
clang/lib/Analysis/FlowSensitive/Transfer.cpp
clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp
clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp
Index: clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp
===================================================================
--- clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp
+++ clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp
@@ -390,7 +390,7 @@
if (const auto *E = selectFirst<CXXConstructExpr>(
"call", match(cxxConstructExpr(HasSpecialBoolType).bind("call"), *S,
getASTContext()))) {
- cast<StructValue>(Env.getValueStrict(*E))
+ cast<StructValue>(Env.getValue(*E))
->setProperty("is_set", Env.getBoolLiteralValue(false));
} else if (const auto *E = selectFirst<CXXMemberCallExpr>(
"call", match(cxxMemberCallExpr(callee(cxxMethodDecl(ofClass(
@@ -547,7 +547,7 @@
*S, getASTContext());
if (const auto *E = selectFirst<CXXConstructExpr>(
"construct", Matches)) {
- cast<StructValue>(Env.getValueStrict(*E))
+ cast<StructValue>(Env.getValue(*E))
->setProperty("has_value", Env.getBoolLiteralValue(false));
} else if (const auto *E =
selectFirst<CXXOperatorCallExpr>("operator", Matches)) {
Index: clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
===================================================================
--- clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
+++ clang/unittests/Analysis/FlowSensitive/TransferTest.cpp
@@ -5524,7 +5524,7 @@
ASTCtx));
ASSERT_THAT(ImplicitCast, NotNull());
- EXPECT_THAT(Env.getValueStrict(*ImplicitCast), IsNull());
+ EXPECT_THAT(Env.getValue(*ImplicitCast), IsNull());
});
}
Index: clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp
===================================================================
--- clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp
+++ clang/unittests/Analysis/FlowSensitive/SignAnalysisTest.cpp
@@ -114,7 +114,7 @@
return {nullptr, {}, {}};
// Value of the unary op.
- auto *UnaryOpValue = State.Env.getValueStrict(*UO);
+ auto *UnaryOpValue = State.Env.getValue(*UO);
if (!UnaryOpValue) {
UnaryOpValue = &State.Env.makeAtomicBoolValue();
State.Env.setValueStrict(*UO, *UnaryOpValue);
@@ -133,7 +133,7 @@
LatticeTransferState &State) {
auto &A = State.Env.arena();
const Formula *Comp;
- if (BoolValue *V = cast_or_null<BoolValue>(State.Env.getValueStrict(*BO))) {
+ if (BoolValue *V = cast_or_null<BoolValue>(State.Env.getValue(*BO))) {
Comp = &V->formula();
} else {
Comp = &A.makeAtomRef(A.makeAtom());
@@ -143,8 +143,8 @@
// FIXME Use this as well:
// auto *NegatedComp = &State.Env.makeNot(*Comp);
- auto *LHS = State.Env.getValueStrict(*BO->getLHS());
- auto *RHS = State.Env.getValueStrict(*BO->getRHS());
+ auto *LHS = State.Env.getValue(*BO->getLHS());
+ auto *RHS = State.Env.getValue(*BO->getRHS());
if (!LHS || !RHS)
return;
@@ -271,7 +271,7 @@
Env.setValue(*Loc, *Val);
}
} else {
- Val = Env.getValueStrict(*E);
+ Val = Env.getValue(*E);
if (!Val) {
Val = Env.createValue(E->getType());
Env.setValueStrict(*E, *Val);
Index: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
+++ clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp
@@ -125,10 +125,10 @@
private:
TerminatorVisitorRetTy extendFlowCondition(const Expr &Cond) {
// The terminator sub-expression might not be evaluated.
- if (Env.getValueStrict(Cond) == nullptr)
+ if (Env.getValue(Cond) == nullptr)
transfer(StmtToEnv, Cond, Env);
- auto *Val = cast_or_null<BoolValue>(Env.getValueStrict(Cond));
+ auto *Val = cast_or_null<BoolValue>(Env.getValue(Cond));
// Value merging depends on flow conditions from different environments
// being mutually exclusive -- that is, they cannot both be true in their
// entirety (even if they may share some clauses). So, we need *some* value
@@ -407,7 +407,7 @@
return;
ParentLoc->setChild(*Member, InitExprLoc);
- } else if (auto *InitExprVal = Env.getValueStrict(*InitExpr)) {
+ } else if (auto *InitExprVal = Env.getValue(*InitExpr)) {
if (Member->getType()->isRecordType()) {
auto *InitValStruct = cast<StructValue>(InitExprVal);
// FIXME: Rather than performing a copy here, we should really be
Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/Transfer.cpp
+++ clang/lib/Analysis/FlowSensitive/Transfer.cpp
@@ -49,8 +49,8 @@
static BoolValue &evaluateBooleanEquality(const Expr &LHS, const Expr &RHS,
Environment &Env) {
- Value *LHSValue = Env.getValueStrict(LHS);
- Value *RHSValue = Env.getValueStrict(RHS);
+ Value *LHSValue = Env.getValue(LHS);
+ Value *RHSValue = Env.getValue(RHS);
if (LHSValue == RHSValue)
return Env.getBoolLiteralValue(true);
@@ -91,7 +91,7 @@
}
static void propagateValue(const Expr &From, const Expr &To, Environment &Env) {
- if (auto *Val = Env.getValueStrict(From))
+ if (auto *Val = Env.getValue(From))
Env.setValueStrict(To, *Val);
}
@@ -133,7 +133,7 @@
if (LHSLoc == nullptr)
break;
- auto *RHSVal = Env.getValueStrict(*RHS);
+ auto *RHSVal = Env.getValue(*RHS);
if (RHSVal == nullptr)
break;
@@ -266,7 +266,7 @@
// model that with a fresh value in the environment, unless it's already a
// boolean.
if (auto *SubExprVal =
- dyn_cast_or_null<BoolValue>(Env.getValueStrict(*SubExpr)))
+ dyn_cast_or_null<BoolValue>(Env.getValue(*SubExpr)))
Env.setValueStrict(*S, *SubExprVal);
else
// FIXME: If integer modeling is added, then update this code to create
@@ -350,7 +350,7 @@
switch (S->getOpcode()) {
case UO_Deref: {
const auto *SubExprVal =
- cast_or_null<PointerValue>(Env.getValueStrict(*SubExpr));
+ cast_or_null<PointerValue>(Env.getValue(*SubExpr));
if (SubExprVal == nullptr)
break;
@@ -367,8 +367,7 @@
break;
}
case UO_LNot: {
- auto *SubExprVal =
- dyn_cast_or_null<BoolValue>(Env.getValueStrict(*SubExpr));
+ auto *SubExprVal = dyn_cast_or_null<BoolValue>(Env.getValue(*SubExpr));
if (SubExprVal == nullptr)
break;
@@ -417,7 +416,7 @@
return;
if (Ret->isPRValue()) {
- auto *Val = Env.getValueStrict(*Ret);
+ auto *Val = Env.getValue(*Ret);
if (Val == nullptr)
return;
@@ -491,8 +490,7 @@
if (S->isElidable()) {
Env.setStorageLocation(*S, *ArgLoc);
- } else if (auto *ArgVal = cast_or_null<StructValue>(
- Env.getValue(*Arg, SkipPast::Reference))) {
+ } else if (auto *ArgVal = cast_or_null<StructValue>(Env.getValue(*Arg))) {
auto &Val = *cast<StructValue>(Env.createValue(S->getType()));
Env.setValueStrict(*S, Val);
copyRecord(ArgVal->getAggregateLoc(), Val.getAggregateLoc(), Env);
@@ -587,7 +585,7 @@
const Expr *SubExpr = S->getSubExpr();
assert(SubExpr != nullptr);
- Value *SubExprVal = Env.getValueStrict(*SubExpr);
+ Value *SubExprVal = Env.getValue(*SubExpr);
if (SubExprVal == nullptr)
return;
@@ -702,7 +700,7 @@
// corresponding environment.
if (const Environment *SubExprEnv = StmtToEnv.getEnvironment(SubExpr))
if (auto *Val =
- dyn_cast_or_null<BoolValue>(SubExprEnv->getValueStrict(SubExpr)))
+ dyn_cast_or_null<BoolValue>(SubExprEnv->getValue(SubExpr)))
return *Val;
// The sub-expression may lie within a basic block that isn't reachable,
@@ -710,9 +708,9 @@
// (see https://discourse.llvm.org/t/70775). In this case, visit `SubExpr`
// within the current environment and then try to get the value that gets
// assigned to it.
- if (Env.getValueStrict(SubExpr) == nullptr)
+ if (Env.getValue(SubExpr) == nullptr)
Visit(&SubExpr);
- if (auto *Val = dyn_cast_or_null<BoolValue>(Env.getValueStrict(SubExpr)))
+ if (auto *Val = dyn_cast_or_null<BoolValue>(Env.getValue(SubExpr)))
return *Val;
// If the value of `SubExpr` is still unknown, we create a fresh symbolic
Index: clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
+++ clang/lib/Analysis/FlowSensitive/Models/UncheckedOptionalAccessModel.cpp
@@ -238,7 +238,7 @@
/// Ensures that `Expr` is mapped to a `BoolValue` and returns its formula.
const Formula &forceBoolValue(Environment &Env, const Expr &Expr) {
- auto *Value = cast_or_null<BoolValue>(Env.getValue(Expr, SkipPast::None));
+ auto *Value = cast_or_null<BoolValue>(Env.getValue(Expr));
if (Value != nullptr)
return Value->formula();
@@ -403,8 +403,7 @@
void initializeOptionalReference(const Expr *OptionalExpr,
const MatchFinder::MatchResult &,
LatticeTransferState &State) {
- if (auto *OptionalVal =
- State.Env.getValue(*OptionalExpr, SkipPast::Reference)) {
+ if (auto *OptionalVal = State.Env.getValue(*OptionalExpr)) {
if (OptionalVal->getProperty("has_value") == nullptr) {
setHasValue(*OptionalVal, State.Env.makeAtomicBoolValue());
}
@@ -430,7 +429,7 @@
}
Value *getValueBehindPossiblePointer(const Expr &E, const Environment &Env) {
- Value *Val = Env.getValue(E, SkipPast::Reference);
+ Value *Val = Env.getValue(E);
if (auto *PointerVal = dyn_cast_or_null<PointerValue>(Val))
return Env.getValue(PointerVal->getPointeeLoc());
return Val;
@@ -579,8 +578,7 @@
// This is a constructor/assignment call for `optional<T>` with argument of
// type `optional<U>` such that `T` is constructible from `U`.
- if (auto *HasValueVal =
- getHasValue(State.Env, State.Env.getValue(E, SkipPast::Reference)))
+ if (auto *HasValueVal = getHasValue(State.Env, State.Env.getValue(E)))
return *HasValueVal;
return State.Env.makeAtomicBoolValue();
}
@@ -714,10 +712,8 @@
Environment &Env = State.Env;
auto &A = Env.arena();
auto *CmpValue = &forceBoolValue(Env, *CmpExpr);
- if (auto *LHasVal = getHasValue(
- Env, Env.getValue(*CmpExpr->getArg(0), SkipPast::Reference)))
- if (auto *RHasVal = getHasValue(
- Env, Env.getValue(*CmpExpr->getArg(1), SkipPast::Reference))) {
+ if (auto *LHasVal = getHasValue(Env, Env.getValue(*CmpExpr->getArg(0))))
+ if (auto *RHasVal = getHasValue(Env, Env.getValue(*CmpExpr->getArg(1)))) {
if (CmpExpr->getOperator() == clang::OO_ExclaimEqual)
CmpValue = &A.makeNot(*CmpValue);
Env.addToFlowCondition(evaluateEquality(A, *CmpValue, LHasVal->formula(),
@@ -729,7 +725,7 @@
const clang::Expr *E, Environment &Env) {
auto &A = Env.arena();
auto *CmpValue = &forceBoolValue(Env, *CmpExpr);
- if (auto *HasVal = getHasValue(Env, Env.getValue(*E, SkipPast::Reference))) {
+ if (auto *HasVal = getHasValue(Env, Env.getValue(*E))) {
if (CmpExpr->getOperator() == clang::OO_ExclaimEqual)
CmpValue = &A.makeNot(*CmpValue);
Env.addToFlowCondition(
Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
===================================================================
--- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
+++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
@@ -686,7 +686,7 @@
assert(E.isPRValue());
if (auto *StructVal = dyn_cast<StructValue>(&Val)) {
- if (auto *ExistingVal = cast_or_null<StructValue>(getValueStrict(E)))
+ if (auto *ExistingVal = cast_or_null<StructValue>(getValue(E)))
assert(&ExistingVal->getAggregateLoc() == &StructVal->getAggregateLoc());
if (StorageLocation *ExistingLoc = getStorageLocation(E, SkipPast::None))
assert(ExistingLoc == &StructVal->getAggregateLoc());
@@ -724,9 +724,7 @@
Value *Environment::getValueStrict(const Expr &E) const {
assert(E.isPRValue());
- Value *Val = getValue(E, SkipPast::None);
-
- return Val;
+ return getValue(E);
}
Value *Environment::createValue(QualType Type) {
@@ -859,7 +857,7 @@
// assert that `InitExpr` is interpreted, rather than supplying a
// default value (assuming we don't update the environment API to return
// references).
- Val = getValueStrict(*InitExpr);
+ Val = getValue(*InitExpr);
if (!Val)
Val = createValue(Ty);
@@ -964,8 +962,7 @@
assert(Expr.getType()->isRecordType());
if (Expr.isPRValue()) {
- if (auto *ExistingVal =
- cast_or_null<StructValue>(Env.getValueStrict(Expr))) {
+ if (auto *ExistingVal = cast_or_null<StructValue>(Env.getValue(Expr))) {
auto &NewVal = Env.create<StructValue>(ExistingVal->getAggregateLoc());
Env.setValueStrict(Expr, NewVal);
return NewVal;
Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
===================================================================
--- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
+++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h
@@ -499,20 +499,14 @@
/// Equivalent to `getValue(getStorageLocation(E, SP))` if `E` is assigned a
/// storage location in the environment, otherwise returns null.
///
- /// The `SP` parameter has no effect.
- ///
- /// This function is deprecated; prefer `getValueStrict()`. For details, see
- /// https://discourse.llvm.org/t/70086.
- Value *getValue(const Expr &E, SkipPast SP) const;
+ /// The `SP` parameter is deprecated and has no effect. New callers should
+ /// avoid passing this parameter.
+ Value *getValue(const Expr &E, SkipPast SP = SkipPast::None) const;
/// Returns the `Value` assigned to the prvalue `E` in the environment, or
/// null if `E` isn't assigned a value in the environment.
///
- /// This function is the preferred alternative to
- /// `getValue(const Expr &, SkipPast)`. Once the migration to strict handling
- /// of value categories is complete (see https://discourse.llvm.org/t/70086),
- /// `getValue()` will be removed and this function will be renamed to
- /// `getValue()`.
+ /// This function is deprecated. Call `getValue(E)` instead.
///
/// Requirements:
///
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits