forked from OSchip/llvm-project
[analyzer] Remove obsolete ObjCPropRef SVal kind.
ObjC properties are handled through their semantic form of ObjCMessageExprs and their wrapper PseudoObjectExprs, and have been for quite a while. The syntactic ObjCPropertyRefExprs do not appear in the CFG and are not visited by ExprEngine. No functionality change. llvm-svn: 160458
This commit is contained in:
parent
be25b07f67
commit
074ebb3a6f
clang
include/clang/StaticAnalyzer/Core/PathSensitive
lib/StaticAnalyzer/Core
|
@ -406,7 +406,7 @@ public:
|
|||
|
||||
namespace loc {
|
||||
|
||||
enum Kind { GotoLabelKind, MemRegionKind, ConcreteIntKind, ObjCPropRefKind };
|
||||
enum Kind { GotoLabelKind, MemRegionKind, ConcreteIntKind };
|
||||
|
||||
class GotoLabel : public Loc {
|
||||
public:
|
||||
|
@ -485,28 +485,6 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// \brief Pseudo-location SVal used by the ExprEngine to simulate a "load" or
|
||||
/// "store" of an ObjC property for the dot syntax.
|
||||
class ObjCPropRef : public Loc {
|
||||
public:
|
||||
explicit ObjCPropRef(const ObjCPropertyRefExpr *E)
|
||||
: Loc(ObjCPropRefKind, E) {}
|
||||
|
||||
const ObjCPropertyRefExpr *getPropRefExpr() const {
|
||||
return static_cast<const ObjCPropertyRefExpr *>(Data);
|
||||
}
|
||||
|
||||
// Implement isa<T> support.
|
||||
static inline bool classof(const SVal* V) {
|
||||
return V->getBaseKind() == LocKind &&
|
||||
V->getSubKind() == ObjCPropRefKind;
|
||||
}
|
||||
|
||||
static inline bool classof(const Loc* V) {
|
||||
return V->getSubKind() == ObjCPropRefKind;
|
||||
}
|
||||
};
|
||||
|
||||
} // end ento::loc namespace
|
||||
} // end GR namespace
|
||||
|
||||
|
|
|
@ -96,8 +96,6 @@ SVal Environment::getSVal(const EnvironmentEntry &Entry,
|
|||
case Stmt::CXXBindTemporaryExprClass:
|
||||
E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
|
||||
continue;
|
||||
case Stmt::ObjCPropertyRefExprClass:
|
||||
return loc::ObjCPropRef(cast<ObjCPropertyRefExpr>(E));
|
||||
case Stmt::ObjCStringLiteralClass: {
|
||||
MemRegionManager &MRMgr = svalBuilder.getRegionManager();
|
||||
const ObjCStringLiteral *SL = cast<ObjCStringLiteral>(E);
|
||||
|
|
|
@ -560,6 +560,10 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
case Expr::MSDependentExistsStmtClass:
|
||||
llvm_unreachable("Stmt should not be in analyzer evaluation loop");
|
||||
|
||||
case Stmt::ObjCSubscriptRefExprClass:
|
||||
case Stmt::ObjCPropertyRefExprClass:
|
||||
llvm_unreachable("These are handled by PseudoObjectExpr");
|
||||
|
||||
case Stmt::GNUNullExprClass: {
|
||||
// GNU __null is a pointer-width integer, not an actual pointer.
|
||||
ProgramStateRef state = Pred->getState();
|
||||
|
@ -575,14 +579,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
Bldr.addNodes(Dst);
|
||||
break;
|
||||
|
||||
// FIXME.
|
||||
case Stmt::ObjCSubscriptRefExprClass:
|
||||
break;
|
||||
|
||||
case Stmt::ObjCPropertyRefExprClass:
|
||||
// Implicitly handled by Environment::getSVal().
|
||||
break;
|
||||
|
||||
case Stmt::ExprWithCleanupsClass:
|
||||
// Handled due to fully linearised CFG.
|
||||
break;
|
||||
|
@ -1699,10 +1695,6 @@ void ExprEngine::evalStore(ExplodedNodeSet &Dst, const Expr *AssignE,
|
|||
// ProgramPoint if it is non-NULL, and LocationE otherwise.
|
||||
const Expr *StoreE = AssignE ? AssignE : LocationE;
|
||||
|
||||
if (isa<loc::ObjCPropRef>(location)) {
|
||||
assert(false);
|
||||
}
|
||||
|
||||
// Evaluate the location (checks for bad dereferences).
|
||||
ExplodedNodeSet Tmp;
|
||||
evalLocation(Tmp, AssignE, LocationE, Pred, state, location, tag, false);
|
||||
|
@ -1727,7 +1719,6 @@ void ExprEngine::evalLoad(ExplodedNodeSet &Dst,
|
|||
QualType LoadTy)
|
||||
{
|
||||
assert(!isa<NonLoc>(location) && "location cannot be a NonLoc.");
|
||||
assert(!isa<loc::ObjCPropRef>(location));
|
||||
|
||||
// Are we loading from a region? This actually results in two loads; one
|
||||
// to fetch the address of the referenced value and one to fetch the
|
||||
|
|
|
@ -309,22 +309,6 @@ void Loc::dumpToStream(raw_ostream &os) const {
|
|||
case loc::MemRegionKind:
|
||||
os << '&' << cast<loc::MemRegionVal>(this)->getRegion()->getString();
|
||||
break;
|
||||
case loc::ObjCPropRefKind: {
|
||||
const ObjCPropertyRefExpr *E = cast<loc::ObjCPropRef>(this)->getPropRefExpr();
|
||||
os << "objc-prop{";
|
||||
if (E->isSuperReceiver())
|
||||
os << "super.";
|
||||
else if (E->getBase())
|
||||
os << "<base>.";
|
||||
|
||||
if (E->isImplicitProperty())
|
||||
os << E->getImplicitPropertyGetter()->getSelector().getAsString();
|
||||
else
|
||||
os << E->getExplicitProperty()->getName();
|
||||
|
||||
os << "}";
|
||||
break;
|
||||
}
|
||||
default:
|
||||
llvm_unreachable("Pretty-printing not implemented for this Loc.");
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue