diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-15 04:39:46 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-15 04:39:46 +0000 |
commit | 04c3bf4fabb46109394df0781bc4d0046afe034d (patch) | |
tree | ce3447278191c13a2382b4b04c20be0118c54428 /clang | |
parent | 2b979ef1282f558a9c12413f9560533ba78aed5e (diff) | |
download | bcm5719-llvm-04c3bf4fabb46109394df0781bc4d0046afe034d.tar.gz bcm5719-llvm-04c3bf4fabb46109394df0781bc4d0046afe034d.zip |
Codegen support for nullptr from C++0x.
llvm-svn: 81835
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExprScalar.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenTypes.cpp | 6 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/nullptr.cpp | 7 |
4 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 8f5ff7284b7..8df52c9377a 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -383,7 +383,8 @@ APValue PointerExprEvaluator::VisitCastExpr(const CastExpr* E) { // Check for pointer->pointer cast if (SubExpr->getType()->isPointerType() || - SubExpr->getType()->isObjCObjectPointerType()) { + SubExpr->getType()->isObjCObjectPointerType() || + SubExpr->getType()->isNullPtrType()) { APValue Result; if (EvaluatePointer(SubExpr, Result, Info)) return Result; diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index aee54464349..7f9b66468b8 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -308,6 +308,10 @@ public: return 0; } + Value *VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E) { + return llvm::Constant::getNullValue(ConvertType(E->getType())); + } + // Binary Operators. Value *EmitMul(const BinOpInfo &Ops) { if (CGF.getContext().getLangOptions().OverflowChecking diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index 94db8366654..6826122ad98 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -229,6 +229,12 @@ const llvm::Type *CodeGenTypes::ConvertNewType(QualType T) { return getTypeForFormat(getLLVMContext(), Context.getFloatTypeSemantics(T)); + case BuiltinType::NullPtr: { + // Model std::nullptr_t as i8* + const llvm::Type *Ty = llvm::IntegerType::get(getLLVMContext(), 8); + return llvm::PointerType::getUnqual(Ty); + } + case BuiltinType::UInt128: case BuiltinType::Int128: return llvm::IntegerType::get(getLLVMContext(), 128); diff --git a/clang/test/CodeGenCXX/nullptr.cpp b/clang/test/CodeGenCXX/nullptr.cpp new file mode 100644 index 00000000000..7bc52ad5210 --- /dev/null +++ b/clang/test/CodeGenCXX/nullptr.cpp @@ -0,0 +1,7 @@ +// RUN: clang-cc -std=c++0x %s -emit-llvm -o %t + +int* a = nullptr; + +void f() { + int* a = nullptr; +} |