diff options
| author | John McCall <rjmccall@apple.com> | 2010-11-13 01:35:44 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-11-13 01:35:44 +0000 |
| commit | e84af4e4867cadf9edbd1120edf6999e42673cdd (patch) | |
| tree | d6819709606fa0dc0c791231ea057430c39f32cd /clang/lib/CodeGen | |
| parent | 1aa5863a3e679e6dcd5dde7531569275e174b7ed (diff) | |
| download | bcm5719-llvm-e84af4e4867cadf9edbd1120edf6999e42673cdd.tar.gz bcm5719-llvm-e84af4e4867cadf9edbd1120edf6999e42673cdd.zip | |
Introduce a null-to-pointer implicit cast kind.
llvm-svn: 118966
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 18 |
2 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 355c18f79c5..bb2eb3c7982 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -1806,6 +1806,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) { case CK_ArrayToPointerDecay: case CK_FunctionToPointerDecay: case CK_NullToMemberPointer: + case CK_NullToPointer: case CK_IntegralToPointer: case CK_PointerToIntegral: case CK_VectorSplat: diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 39f25f916b8..d07d20395d5 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -48,6 +48,13 @@ struct BinOpInfo { const Expr *E; // Entire expr, for error unsupported. May not be binop. }; +static bool MustVisitNullValue(const Expr *E) { + // If a null pointer expression's type is the C++0x nullptr_t, then + // it's not necessarily a simple constant and it must be evaluated + // for its potential side effects. + return E->getType()->isNullPtrType(); +} + class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, Value*> { CodeGenFunction &CGF; @@ -1044,10 +1051,15 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) { case CK_FunctionToPointerDecay: return EmitLValue(E).getAddress(); + case CK_NullToPointer: + if (MustVisitNullValue(E)) + (void) Visit(E); + + return llvm::ConstantPointerNull::get( + cast<llvm::PointerType>(ConvertType(DestTy))); + case CK_NullToMemberPointer: { - // If the subexpression's type is the C++0x nullptr_t, emit the - // subexpression, which may have side effects. - if (E->getType()->isNullPtrType()) + if (MustVisitNullValue(E)) (void) Visit(E); const MemberPointerType *MPT = CE->getType()->getAs<MemberPointerType>(); |

