Pointee->isVoidType() && // to void*
CE->getSubExpr()->getType()->isIntegerType()) // from int.
return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
+ // Or an integer cast.
+ } else if (CE->getType()->isIntegerType()) {
+ return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
}
}
} else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
return true;
}
-static Expr *ignoreIntegerCasts(Expr *E) {
- while (true) {
- if (ExplicitCastExpr *ECE = dyn_cast<ExplicitCastExpr>(E)) {
- if (ECE->getType()->isIntegerType()) {
- E = ECE->getSubExpr();
- continue;
- }
- }
-
- return E;
- }
-}
-
/// CheckPointerConversion - Check the pointer conversion from the
/// expression From to the type ToType. This routine checks for
/// ambiguous or inaccessible derived-to-base pointer
Kind = CK_BitCast;
if (!IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&
- ignoreIntegerCasts(From)->
- isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) ==
+ From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) ==
Expr::NPCK_ZeroExpression) {
if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy))
DiagRuntimeBehavior(From->getExprLoc(), From,