diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-11-13 01:24:28 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-11-13 01:24:28 +0000 |
| commit | 7309f60b9e9084f442150337acd112148ae212d9 (patch) | |
| tree | 1eb289a905e3ffc60034298677e65df8b86871f9 /clang/lib/Sema | |
| parent | 3314f56ca84f393cd8dac40175d2e6c28d10405f (diff) | |
| download | bcm5719-llvm-7309f60b9e9084f442150337acd112148ae212d9.tar.gz bcm5719-llvm-7309f60b9e9084f442150337acd112148ae212d9.zip | |
PR10837: Warn if a null pointer constant is formed by a zero integer constant
expression that is not a zero literal, in C. Patch by Ivan A. Kosarev!
llvm-svn: 194540
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 3c6b3b046de..7cd56705093 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -10614,8 +10614,17 @@ bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, switch (ConvTy) { case Compatible: - DiagnoseAssignmentEnum(DstType, SrcType, SrcExpr); - return false; + // See if a proper null pointer constant is to be assigned. + if (DstType->isAnyPointerType() && !SrcType->isAnyPointerType() && + SrcExpr->isNullPointerConstant(Context, + Expr::NPC_NeverValueDependent) == + Expr::NPCK_ZeroExpression && + !isUnevaluatedContext()) + Diag(SrcExpr->getExprLoc(), diag::warn_non_literal_null_pointer) + << DstType << SrcExpr->getSourceRange(); + + DiagnoseAssignmentEnum(DstType, SrcType, SrcExpr); + return false; case PointerToInt: DiagKind = diag::ext_typecheck_convert_pointer_int; |

