Rework ExprEngine::evalLoad and clients (e.g. VisitBinaryOperator) so that when we generate a new ExplodedNode
we use the same Expr* as the one being currently visited. This is preparation for transitioning to having ProgramPoints refer to CFGStmts. This required a bit of trickery. We wish to keep the old Expr* bindings in the Environment intact, as plenty of logic relies on it and there is no reason to change it, but we sometimes want the Stmt* for the ProgramPoint to be different than the Expr* being used for bindings. This requires adding an extra argument for some functions (e.g., evalLocation). This looks a bit strange for some clients, but it will look a lot cleaner when were start using CFGStmt* in the appropriate places. As some fallout, the diagnostics arrows are a bit difference, since some of the node locations have changed. I have audited these, and they look reasonable. llvm-svn: 154214
This commit is contained in:
parent
feee554e3b
commit
a85f38ba3a
|
@ -229,8 +229,10 @@ public:
|
|||
/// \brief Run checkers for load/store of a location.
|
||||
void runCheckersForLocation(ExplodedNodeSet &Dst,
|
||||
const ExplodedNodeSet &Src,
|
||||
SVal location, bool isLoad,
|
||||
const Stmt *S,
|
||||
SVal location,
|
||||
bool isLoad,
|
||||
const Stmt *NodeEx,
|
||||
const Stmt *BoundEx,
|
||||
ExprEngine &Eng);
|
||||
|
||||
/// \brief Run checkers for binding of a value to a location.
|
||||
|
@ -343,7 +345,8 @@ public:
|
|||
typedef CheckerFn<void (const ObjCMessage &, CheckerContext &)>
|
||||
CheckObjCMessageFunc;
|
||||
|
||||
typedef CheckerFn<void (const SVal &location, bool isLoad, const Stmt *S,
|
||||
typedef CheckerFn<void (const SVal &location, bool isLoad,
|
||||
const Stmt *S,
|
||||
CheckerContext &)>
|
||||
CheckLocationFunc;
|
||||
|
||||
|
|
|
@ -440,8 +440,13 @@ public:
|
|||
// be the same as Pred->state, and when 'location' may not be the
|
||||
// same as state->getLValue(Ex).
|
||||
/// Simulate a read of the result of Ex.
|
||||
void evalLoad(ExplodedNodeSet &Dst, const Expr *Ex, ExplodedNode *Pred,
|
||||
ProgramStateRef St, SVal location, const ProgramPointTag *tag = 0,
|
||||
void evalLoad(ExplodedNodeSet &Dst,
|
||||
const Expr *NodeEx, /* Eventually will be a CFGStmt */
|
||||
const Expr *BoundExpr,
|
||||
ExplodedNode *Pred,
|
||||
ProgramStateRef St,
|
||||
SVal location,
|
||||
const ProgramPointTag *tag = 0,
|
||||
QualType LoadTy = QualType());
|
||||
|
||||
// FIXME: 'tag' should be removed, and a LocationContext should be used
|
||||
|
@ -450,13 +455,21 @@ public:
|
|||
ExplodedNode *Pred, ProgramStateRef St, SVal TargetLV, SVal Val,
|
||||
const ProgramPointTag *tag = 0);
|
||||
private:
|
||||
void evalLoadCommon(ExplodedNodeSet &Dst, const Expr *Ex, ExplodedNode *Pred,
|
||||
ProgramStateRef St, SVal location, const ProgramPointTag *tag,
|
||||
void evalLoadCommon(ExplodedNodeSet &Dst,
|
||||
const Expr *NodeEx, /* Eventually will be a CFGStmt */
|
||||
const Expr *BoundEx,
|
||||
ExplodedNode *Pred,
|
||||
ProgramStateRef St,
|
||||
SVal location,
|
||||
const ProgramPointTag *tag,
|
||||
QualType LoadTy);
|
||||
|
||||
// FIXME: 'tag' should be removed, and a LocationContext should be used
|
||||
// instead.
|
||||
void evalLocation(ExplodedNodeSet &Dst, const Stmt *S, ExplodedNode *Pred,
|
||||
void evalLocation(ExplodedNodeSet &Dst,
|
||||
const Stmt *NodeEx, /* This will eventually be a CFGStmt */
|
||||
const Stmt *BoundEx,
|
||||
ExplodedNode *Pred,
|
||||
ProgramStateRef St, SVal location,
|
||||
const ProgramPointTag *tag, bool isLoad);
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@ bool OSAtomicChecker::evalOSAtomicCompareAndSwap(const CallExpr *CE,
|
|||
dyn_cast_or_null<TypedValueRegion>(location.getAsRegion())) {
|
||||
LoadTy = TR->getValueType();
|
||||
}
|
||||
Eng.evalLoad(Tmp, theValueExpr, Pred,
|
||||
Eng.evalLoad(Tmp, CE, theValueExpr, Pred,
|
||||
state, location, &OSAtomicLoadTag, LoadTy);
|
||||
|
||||
if (Tmp.empty()) {
|
||||
|
@ -172,7 +172,7 @@ bool OSAtomicChecker::evalOSAtomicCompareAndSwap(const CallExpr *CE,
|
|||
val = svalBuilder.evalCast(val,R->getValueType(), newValueExpr->getType());
|
||||
}
|
||||
|
||||
Eng.evalStore(TmpStore, NULL, theValueExpr, N,
|
||||
Eng.evalStore(TmpStore, CE, theValueExpr, N,
|
||||
stateEqual, location, val, &OSAtomicStoreTag);
|
||||
|
||||
if (TmpStore.empty()) {
|
||||
|
|
|
@ -222,25 +222,30 @@ namespace {
|
|||
const CheckersTy &Checkers;
|
||||
SVal Loc;
|
||||
bool IsLoad;
|
||||
const Stmt *S;
|
||||
const Stmt *NodeEx; /* Will become a CFGStmt */
|
||||
const Stmt *BoundEx;
|
||||
ExprEngine &Eng;
|
||||
|
||||
CheckersTy::const_iterator checkers_begin() { return Checkers.begin(); }
|
||||
CheckersTy::const_iterator checkers_end() { return Checkers.end(); }
|
||||
|
||||
CheckLocationContext(const CheckersTy &checkers,
|
||||
SVal loc, bool isLoad, const Stmt *s, ExprEngine &eng)
|
||||
: Checkers(checkers), Loc(loc), IsLoad(isLoad), S(s), Eng(eng) { }
|
||||
SVal loc, bool isLoad, const Stmt *NodeEx,
|
||||
const Stmt *BoundEx,
|
||||
ExprEngine &eng)
|
||||
: Checkers(checkers), Loc(loc), IsLoad(isLoad), NodeEx(NodeEx),
|
||||
BoundEx(BoundEx), Eng(eng) {}
|
||||
|
||||
void runChecker(CheckerManager::CheckLocationFunc checkFn,
|
||||
NodeBuilder &Bldr, ExplodedNode *Pred) {
|
||||
ProgramPoint::Kind K = IsLoad ? ProgramPoint::PreLoadKind :
|
||||
ProgramPoint::PreStoreKind;
|
||||
const ProgramPoint &L = ProgramPoint::getProgramPoint(S, K,
|
||||
Pred->getLocationContext(), checkFn.Checker);
|
||||
const ProgramPoint &L =
|
||||
ProgramPoint::getProgramPoint(NodeEx, K,
|
||||
Pred->getLocationContext(),
|
||||
checkFn.Checker);
|
||||
CheckerContext C(Bldr, Eng, Pred, L);
|
||||
|
||||
checkFn(Loc, IsLoad, S, C);
|
||||
checkFn(Loc, IsLoad, BoundEx, C);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -250,8 +255,11 @@ namespace {
|
|||
void CheckerManager::runCheckersForLocation(ExplodedNodeSet &Dst,
|
||||
const ExplodedNodeSet &Src,
|
||||
SVal location, bool isLoad,
|
||||
const Stmt *S, ExprEngine &Eng) {
|
||||
CheckLocationContext C(LocationCheckers, location, isLoad, S, Eng);
|
||||
const Stmt *NodeEx,
|
||||
const Stmt *BoundEx,
|
||||
ExprEngine &Eng) {
|
||||
CheckLocationContext C(LocationCheckers, location, isLoad, NodeEx,
|
||||
BoundEx, Eng);
|
||||
expandGraphWithCheckers(C, Dst, Src);
|
||||
}
|
||||
|
||||
|
|
|
@ -1542,7 +1542,7 @@ void ExprEngine::VisitMemberExpr(const MemberExpr *M, ExplodedNode *Pred,
|
|||
ProgramPoint::PostLValueKind);
|
||||
else {
|
||||
Bldr.takeNodes(Pred);
|
||||
evalLoad(Dst, M, Pred, state, L);
|
||||
evalLoad(Dst, M, M, Pred, state, L);
|
||||
Bldr.addNodes(Dst);
|
||||
}
|
||||
}
|
||||
|
@ -1611,7 +1611,7 @@ void ExprEngine::evalStore(ExplodedNodeSet &Dst, const Expr *AssignE,
|
|||
|
||||
// Evaluate the location (checks for bad dereferences).
|
||||
ExplodedNodeSet Tmp;
|
||||
evalLocation(Tmp, LocationE, Pred, state, location, tag, false);
|
||||
evalLocation(Tmp, AssignE, LocationE, Pred, state, location, tag, false);
|
||||
|
||||
if (Tmp.empty())
|
||||
return;
|
||||
|
@ -1623,15 +1623,17 @@ void ExprEngine::evalStore(ExplodedNodeSet &Dst, const Expr *AssignE,
|
|||
evalBind(Dst, StoreE, *NI, location, Val, false);
|
||||
}
|
||||
|
||||
void ExprEngine::evalLoad(ExplodedNodeSet &Dst, const Expr *Ex,
|
||||
void ExprEngine::evalLoad(ExplodedNodeSet &Dst,
|
||||
const Expr *NodeEx,
|
||||
const Expr *BoundEx,
|
||||
ExplodedNode *Pred,
|
||||
ProgramStateRef state, SVal location,
|
||||
const ProgramPointTag *tag, QualType LoadTy) {
|
||||
ProgramStateRef state,
|
||||
SVal location,
|
||||
const ProgramPointTag *tag,
|
||||
QualType LoadTy)
|
||||
{
|
||||
assert(!isa<NonLoc>(location) && "location cannot be a NonLoc.");
|
||||
|
||||
if (isa<loc::ObjCPropRef>(location)) {
|
||||
assert(false);
|
||||
}
|
||||
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
|
||||
|
@ -1644,30 +1646,36 @@ void ExprEngine::evalLoad(ExplodedNodeSet &Dst, const Expr *Ex,
|
|||
static SimpleProgramPointTag
|
||||
loadReferenceTag("ExprEngine : Load Reference");
|
||||
ExplodedNodeSet Tmp;
|
||||
evalLoadCommon(Tmp, Ex, Pred, state, location, &loadReferenceTag,
|
||||
evalLoadCommon(Tmp, NodeEx, BoundEx, Pred, state,
|
||||
location, &loadReferenceTag,
|
||||
getContext().getPointerType(RT->getPointeeType()));
|
||||
|
||||
// Perform the load from the referenced value.
|
||||
for (ExplodedNodeSet::iterator I=Tmp.begin(), E=Tmp.end() ; I!=E; ++I) {
|
||||
state = (*I)->getState();
|
||||
location = state->getSVal(Ex, (*I)->getLocationContext());
|
||||
evalLoadCommon(Dst, Ex, *I, state, location, tag, LoadTy);
|
||||
location = state->getSVal(BoundEx, (*I)->getLocationContext());
|
||||
evalLoadCommon(Dst, NodeEx, BoundEx, *I, state, location, tag, LoadTy);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
evalLoadCommon(Dst, Ex, Pred, state, location, tag, LoadTy);
|
||||
evalLoadCommon(Dst, NodeEx, BoundEx, Pred, state, location, tag, LoadTy);
|
||||
}
|
||||
|
||||
void ExprEngine::evalLoadCommon(ExplodedNodeSet &Dst, const Expr *Ex,
|
||||
void ExprEngine::evalLoadCommon(ExplodedNodeSet &Dst,
|
||||
const Expr *NodeEx,
|
||||
const Expr *BoundEx,
|
||||
ExplodedNode *Pred,
|
||||
ProgramStateRef state, SVal location,
|
||||
const ProgramPointTag *tag, QualType LoadTy) {
|
||||
|
||||
ProgramStateRef state,
|
||||
SVal location,
|
||||
const ProgramPointTag *tag,
|
||||
QualType LoadTy) {
|
||||
assert(NodeEx);
|
||||
assert(BoundEx);
|
||||
// Evaluate the location (checks for bad dereferences).
|
||||
ExplodedNodeSet Tmp;
|
||||
evalLocation(Tmp, Ex, Pred, state, location, tag, true);
|
||||
evalLocation(Tmp, NodeEx, BoundEx, Pred, state, location, tag, true);
|
||||
if (Tmp.empty())
|
||||
return;
|
||||
|
||||
|
@ -1682,24 +1690,30 @@ void ExprEngine::evalLoadCommon(ExplodedNodeSet &Dst, const Expr *Ex,
|
|||
|
||||
if (location.isUnknown()) {
|
||||
// This is important. We must nuke the old binding.
|
||||
Bldr.generateNode(Ex, *NI, state->BindExpr(Ex, LCtx, UnknownVal()),
|
||||
false, tag, ProgramPoint::PostLoadKind);
|
||||
Bldr.generateNode(NodeEx, *NI,
|
||||
state->BindExpr(BoundEx, LCtx, UnknownVal()),
|
||||
false, tag,
|
||||
ProgramPoint::PostLoadKind);
|
||||
}
|
||||
else {
|
||||
if (LoadTy.isNull())
|
||||
LoadTy = Ex->getType();
|
||||
LoadTy = BoundEx->getType();
|
||||
SVal V = state->getSVal(cast<Loc>(location), LoadTy);
|
||||
Bldr.generateNode(Ex, *NI, state->bindExprAndLocation(Ex, LCtx,
|
||||
location, V),
|
||||
Bldr.generateNode(NodeEx, *NI,
|
||||
state->bindExprAndLocation(BoundEx, LCtx, location, V),
|
||||
false, tag, ProgramPoint::PostLoadKind);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ExprEngine::evalLocation(ExplodedNodeSet &Dst, const Stmt *S,
|
||||
void ExprEngine::evalLocation(ExplodedNodeSet &Dst,
|
||||
const Stmt *NodeEx,
|
||||
const Stmt *BoundEx,
|
||||
ExplodedNode *Pred,
|
||||
ProgramStateRef state, SVal location,
|
||||
const ProgramPointTag *tag, bool isLoad) {
|
||||
ProgramStateRef state,
|
||||
SVal location,
|
||||
const ProgramPointTag *tag,
|
||||
bool isLoad) {
|
||||
StmtNodeBuilder BldrTop(Pred, Dst, *currentBuilderContext);
|
||||
// Early checks for performance reason.
|
||||
if (location.isUnknown()) {
|
||||
|
@ -1721,12 +1735,11 @@ void ExprEngine::evalLocation(ExplodedNodeSet &Dst, const Stmt *S,
|
|||
|
||||
// FIXME: why is 'tag' not used instead of etag?
|
||||
static SimpleProgramPointTag etag("ExprEngine: Location");
|
||||
|
||||
Bldr.generateNode(S, Pred, state, false, &etag);
|
||||
Bldr.generateNode(NodeEx, Pred, state, false, &etag);
|
||||
}
|
||||
ExplodedNodeSet Tmp;
|
||||
getCheckerManager().runCheckersForLocation(Tmp, Src, location, isLoad, S,
|
||||
*this);
|
||||
getCheckerManager().runCheckersForLocation(Tmp, Src, location, isLoad,
|
||||
NodeEx, BoundEx, *this);
|
||||
BldrTop.addNodes(Tmp);
|
||||
}
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ void ExprEngine::VisitBinaryOperator(const BinaryOperator* B,
|
|||
// null dereferences, and so on.
|
||||
ExplodedNodeSet Tmp;
|
||||
SVal location = LeftV;
|
||||
evalLoad(Tmp, LHS, *it, state, location);
|
||||
evalLoad(Tmp, B, LHS, *it, state, location);
|
||||
|
||||
for (ExplodedNodeSet::iterator I = Tmp.begin(), E = Tmp.end(); I != E;
|
||||
++I) {
|
||||
|
@ -189,7 +189,7 @@ void ExprEngine::VisitCast(const CastExpr *CastE, const Expr *Ex,
|
|||
ExplodedNode *subExprNode = *I;
|
||||
ProgramStateRef state = subExprNode->getState();
|
||||
const LocationContext *LCtx = subExprNode->getLocationContext();
|
||||
evalLoad(Dst, CastE, subExprNode, state, state->getSVal(Ex, LCtx));
|
||||
evalLoad(Dst, CastE, CastE, subExprNode, state, state->getSVal(Ex, LCtx));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -693,7 +693,7 @@ void ExprEngine::VisitIncrementDecrementOperator(const UnaryOperator* U,
|
|||
|
||||
// Perform a load.
|
||||
ExplodedNodeSet Tmp;
|
||||
evalLoad(Tmp, Ex, Pred, state, loc);
|
||||
evalLoad(Tmp, U, Ex, Pred, state, loc);
|
||||
|
||||
ExplodedNodeSet Dst2;
|
||||
StmtNodeBuilder Bldr(Tmp, Dst2, *currentBuilderContext);
|
||||
|
@ -762,7 +762,7 @@ void ExprEngine::VisitIncrementDecrementOperator(const UnaryOperator* U,
|
|||
// Perform the store.
|
||||
Bldr.takeNodes(*I);
|
||||
ExplodedNodeSet Dst3;
|
||||
evalStore(Dst3, NULL, U, *I, state, loc, Result);
|
||||
evalStore(Dst3, U, U, *I, state, loc, Result);
|
||||
Bldr.addNodes(Dst3);
|
||||
}
|
||||
Dst.insert(Dst2);
|
||||
|
|
|
@ -87,7 +87,7 @@ void ExprEngine::VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S,
|
|||
|
||||
ExplodedNodeSet dstLocation;
|
||||
Bldr.takeNodes(Pred);
|
||||
evalLocation(dstLocation, elem, Pred, state, elementV, NULL, false);
|
||||
evalLocation(dstLocation, S, elem, Pred, state, elementV, NULL, false);
|
||||
Bldr.addNodes(dstLocation);
|
||||
|
||||
for (ExplodedNodeSet::iterator NI = dstLocation.begin(),
|
||||
|
|
|
@ -23,6 +23,7 @@ void test_has_bug() {
|
|||
has_bug(0);
|
||||
}
|
||||
|
||||
|
||||
// CHECK: <?xml version="1.0" encoding="UTF-8"?>
|
||||
// CHECK: <plist version="1.0">
|
||||
// CHECK: <dict>
|
||||
|
@ -314,7 +315,7 @@ void test_has_bug() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>19</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -366,4 +367,3 @@ void test_has_bug() {
|
|||
// CHECK: </array>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </plist>
|
||||
|
||||
|
|
|
@ -34,12 +34,12 @@ void test_bug_2() {
|
|||
// CHECK: <key>start</key>
|
||||
// CHECK: <array>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>14</integer>
|
||||
// CHECK: <key>line</key><integer>9</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>14</integer>
|
||||
// CHECK: <key>line</key><integer>9</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
|
@ -47,12 +47,12 @@ void test_bug_2() {
|
|||
// CHECK: <key>end</key>
|
||||
// CHECK: <array>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>15</integer>
|
||||
// CHECK: <key>line</key><integer>10</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>15</integer>
|
||||
// CHECK: <key>line</key><integer>10</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
|
@ -64,7 +64,7 @@ void test_bug_2() {
|
|||
// CHECK: <key>kind</key><string>event</string>
|
||||
// CHECK: <key>location</key>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>15</integer>
|
||||
// CHECK: <key>line</key><integer>10</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
|
@ -72,12 +72,12 @@ void test_bug_2() {
|
|||
// CHECK: <array>
|
||||
// CHECK: <array>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>15</integer>
|
||||
// CHECK: <key>line</key><integer>10</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>15</integer>
|
||||
// CHECK: <key>line</key><integer>10</integer>
|
||||
// CHECK: <key>col</key><integer>8</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
|
@ -99,9 +99,9 @@ void test_bug_2() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <key>depth</key><integer>1</integer>
|
||||
// CHECK: <key>extended_message</key>
|
||||
// CHECK: <string>Entered call from 'test_bug_2'</string>
|
||||
// CHECK: <string>Entered call from 'test_bug_1'</string>
|
||||
// CHECK: <key>message</key>
|
||||
// CHECK: <string>Entered call from 'test_bug_2'</string>
|
||||
// CHECK: <string>Entered call from 'test_bug_1'</string>
|
||||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>kind</key><string>control</string>
|
||||
|
@ -130,7 +130,7 @@ void test_bug_2() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>5</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -170,6 +170,8 @@ void test_bug_2() {
|
|||
// CHECK: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string>
|
||||
// CHECK: <key>category</key><string>Logic error</string>
|
||||
// CHECK: <key>type</key><string>Dereference of null pointer</string>
|
||||
// CHECK: <key>issue_context_kind</key><string>function</string>
|
||||
// CHECK: <key>issue_context</key><string>bug</string>
|
||||
// CHECK: <key>location</key>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>5</integer>
|
||||
|
|
|
@ -95,7 +95,7 @@ void rdar8331641(int x) {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -174,7 +174,7 @@ void rdar8331641(int x) {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>12</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -253,7 +253,7 @@ void rdar8331641(int x) {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>19</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -395,7 +395,7 @@ void rdar8331641(int x) {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>24</integer>
|
||||
// CHECK: <key>col</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>5</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -542,7 +542,7 @@ void rdar8331641(int x) {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>31</integer>
|
||||
// CHECK: <key>col</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>5</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -655,7 +655,7 @@ void rdar8331641(int x) {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>38</integer>
|
||||
// CHECK: <key>col</key><integer>8</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
|
|
@ -118,7 +118,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -197,7 +197,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>12</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -276,7 +276,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>19</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -418,7 +418,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>24</integer>
|
||||
// CHECK: <key>col</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>5</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -565,7 +565,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>32</integer>
|
||||
// CHECK: <key>col</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>5</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -678,7 +678,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>39</integer>
|
||||
// CHECK: <key>col</key><integer>8</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -893,7 +893,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>51</integer>
|
||||
// CHECK: <key>col</key><integer>4</integer>
|
||||
// CHECK: <key>col</key><integer>3</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
@ -1284,7 +1284,7 @@ int test_cond_assign() {
|
|||
// CHECK: </dict>
|
||||
// CHECK: <dict>
|
||||
// CHECK: <key>line</key><integer>78</integer>
|
||||
// CHECK: <key>col</key><integer>6</integer>
|
||||
// CHECK: <key>col</key><integer>5</integer>
|
||||
// CHECK: <key>file</key><integer>0</integer>
|
||||
// CHECK: </dict>
|
||||
// CHECK: </array>
|
||||
|
|
Loading…
Reference in New Issue