Index: cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -275,11 +275,17 @@ case Stmt::ImplicitCastExprClass: { const CastExpr *CE = cast(E); - if (CE->getCastKind() == CK_ArrayToPointerDecay) { - Optional ArrayVal = getConstantVal(CE->getSubExpr()); - if (!ArrayVal) + switch (CE->getCastKind()) { + default: + break; + case CK_ArrayToPointerDecay: + case CK_BitCast: { + const Expr *SE = CE->getSubExpr(); + Optional Val = getConstantVal(SE); + if (!Val) return None; - return evalCast(*ArrayVal, CE->getType(), CE->getSubExpr()->getType()); + return evalCast(*Val, CE->getType(), SE->getType()); + } } // FALLTHROUGH } Index: cfe/trunk/test/Analysis/inline.cpp =================================================================== --- cfe/trunk/test/Analysis/inline.cpp +++ cfe/trunk/test/Analysis/inline.cpp @@ -275,7 +275,7 @@ clang_analyzer_eval(defaultReferenceZero(1) == -1); // expected-warning{{TRUE}} clang_analyzer_eval(defaultReferenceZero() == 0); // expected-warning{{TRUE}} -} + } double defaultFloatReference(const double &i = 42) { return -i; @@ -300,6 +300,13 @@ clang_analyzer_eval(defaultString("xyz") == 'y'); // expected-warning{{TRUE}} clang_analyzer_eval(defaultString() == 'b'); // expected-warning{{TRUE}} } + + const void * const void_string = "abc"; + + void testBitcastedString() { + clang_analyzer_eval(0 != void_string); // expected-warning{{TRUE}} + clang_analyzer_eval('b' == ((char *)void_string)[1]); // expected-warning{{TRUE}} + } } namespace OperatorNew {