[cfe-commits] r127458 - /cfe/trunk/lib/Sema/SemaExpr.cpp
John McCall
rjmccall at apple.com
Thu Mar 10 20:25:25 PST 2011
Author: rjmccall
Date: Thu Mar 10 22:25:25 2011
New Revision: 127458
URL: http://llvm.org/viewvc/llvm-project?rev=127458&view=rev
Log:
When comparing a null pointer and something else, always cast the null
pointer instead of the other operand.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=127458&r1=127457&r2=127458&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Mar 10 22:25:25 2011
@@ -6965,8 +6965,12 @@
Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
}
- if (LCanPointeeTy != RCanPointeeTy)
- ImpCastExprToType(rex, lType, CK_BitCast);
+ if (LCanPointeeTy != RCanPointeeTy) {
+ if (LHSIsNull && !RHSIsNull)
+ ImpCastExprToType(lex, rType, CK_BitCast);
+ else
+ ImpCastExprToType(rex, lType, CK_BitCast);
+ }
return ResultTy;
}
@@ -7053,39 +7057,46 @@
&& ((lType->isBlockPointerType() && rType->isPointerType())
|| (lType->isPointerType() && rType->isBlockPointerType()))) {
if (!LHSIsNull && !RHSIsNull) {
- if (!((rType->isPointerType() && rType->getAs<PointerType>()
+ if (!((rType->isPointerType() && rType->castAs<PointerType>()
->getPointeeType()->isVoidType())
- || (lType->isPointerType() && lType->getAs<PointerType>()
+ || (lType->isPointerType() && lType->castAs<PointerType>()
->getPointeeType()->isVoidType())))
Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks)
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
}
- ImpCastExprToType(rex, lType, CK_BitCast);
+ if (LHSIsNull && !RHSIsNull)
+ ImpCastExprToType(lex, rType, CK_BitCast);
+ else
+ ImpCastExprToType(rex, lType, CK_BitCast);
return ResultTy;
}
- if ((lType->isObjCObjectPointerType() || rType->isObjCObjectPointerType())) {
- if (lType->isPointerType() || rType->isPointerType()) {
- const PointerType *LPT = lType->getAs<PointerType>();
- const PointerType *RPT = rType->getAs<PointerType>();
- bool LPtrToVoid = LPT ?
- Context.getCanonicalType(LPT->getPointeeType())->isVoidType() : false;
- bool RPtrToVoid = RPT ?
- Context.getCanonicalType(RPT->getPointeeType())->isVoidType() : false;
+ if (lType->isObjCObjectPointerType() || rType->isObjCObjectPointerType()) {
+ const PointerType *LPT = lType->getAs<PointerType>();
+ const PointerType *RPT = rType->getAs<PointerType>();
+ if (LPT || RPT) {
+ bool LPtrToVoid = LPT ? LPT->getPointeeType()->isVoidType() : false;
+ bool RPtrToVoid = RPT ? RPT->getPointeeType()->isVoidType() : false;
if (!LPtrToVoid && !RPtrToVoid &&
!Context.typesAreCompatible(lType, rType)) {
Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
}
- ImpCastExprToType(rex, lType, CK_BitCast);
+ if (LHSIsNull && !RHSIsNull)
+ ImpCastExprToType(lex, rType, CK_BitCast);
+ else
+ ImpCastExprToType(rex, lType, CK_BitCast);
return ResultTy;
}
if (lType->isObjCObjectPointerType() && rType->isObjCObjectPointerType()) {
if (!Context.areComparableObjCPointerTypes(lType, rType))
Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
- ImpCastExprToType(rex, lType, CK_BitCast);
+ if (LHSIsNull && !RHSIsNull)
+ ImpCastExprToType(lex, rType, CK_BitCast);
+ else
+ ImpCastExprToType(rex, lType, CK_BitCast);
return ResultTy;
}
}
More information about the cfe-commits
mailing list