summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2010-01-14 03:45:06 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2010-01-14 03:45:06 +0000
commit803ade253292d1792b8fa389495fbe3d5bac8fb4 (patch)
tree24ecfd42a61d681771df2a26607a33b45395df4d /clang
parent200c99dd1e57ef50b163456aac9d40168908325b (diff)
downloadbcm5719-llvm-803ade253292d1792b8fa389495fbe3d5bac8fb4.tar.gz
bcm5719-llvm-803ade253292d1792b8fa389495fbe3d5bac8fb4.zip
Fix pr6035.
llvm-svn: 93422
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Analysis/SValuator.cpp3
-rw-r--r--clang/test/Analysis/casts.c11
2 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/Analysis/SValuator.cpp b/clang/lib/Analysis/SValuator.cpp
index 0e56026bb4c..8392fcf65a2 100644
--- a/clang/lib/Analysis/SValuator.cpp
+++ b/clang/lib/Analysis/SValuator.cpp
@@ -66,6 +66,9 @@ SValuator::CastResult SValuator::EvalCast(SVal val, const GRState *state,
if (C.hasSameUnqualifiedType(castTy, originalTy))
return CastResult(state, val);
+ if (castTy->isIntegerType() && originalTy->isIntegerType())
+ return CastResult(state, EvalCastNL(cast<NonLoc>(val), castTy));
+
// Check for casts from pointers to integers.
if (castTy->isIntegerType() && Loc::IsLocType(originalTy))
return CastResult(state, EvalCastL(cast<Loc>(val), castTy));
diff --git a/clang/test/Analysis/casts.c b/clang/test/Analysis/casts.c
index 4b729161718..e106f348329 100644
--- a/clang/test/Analysis/casts.c
+++ b/clang/test/Analysis/casts.c
@@ -57,3 +57,14 @@ void doit(char *data, int len) {
memcpy(buf, data, len);
}
}
+
+struct pcm_feeder {
+ void *data;
+};
+// Test cast a pointer to long and then to int does not crash SValuator.
+void feed_swaplr (struct pcm_feeder *f)
+{
+ int bps;
+ bps = (long) f->data;
+ (void) bps;
+}
OpenPOWER on IntegriCloud