diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-05-10 18:38:11 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-05-10 18:38:11 +0000 |
commit | 6e8ed16ffef02b82995a90bdcf10ffff7d63839a (patch) | |
tree | e493c276b5aea9c425cadfc2d53d0f3dd78fe18d /lib/AST | |
parent | 9f2e23e708d3fa7c54f6626cd901993a86e007e6 (diff) |
Implement C++0x nullptr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71405 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST')
-rw-r--r-- | lib/AST/ASTContext.cpp | 6 | ||||
-rw-r--r-- | lib/AST/Expr.cpp | 4 | ||||
-rw-r--r-- | lib/AST/ExprCXX.cpp | 8 | ||||
-rw-r--r-- | lib/AST/ExprConstant.cpp | 4 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 4 | ||||
-rw-r--r-- | lib/AST/Type.cpp | 7 |
6 files changed, 32 insertions, 1 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 4aed59f37e..133e8c20b8 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -276,6 +276,9 @@ void ASTContext::InitBuiltinTypes() { // void * type VoidPtrTy = getPointerType(VoidTy); + + // nullptr type (C++0x 2.14.7) + InitBuiltinType(NullPtrTy, BuiltinType::NullPtr); } //===----------------------------------------------------------------------===// @@ -431,6 +434,9 @@ ASTContext::getTypeInfo(const Type *T) { Width = Target.getLongDoubleWidth(); Align = Target.getLongDoubleAlign(); break; + case BuiltinType::NullPtr: + Width = Target.getPointerWidth(0); // C++ 3.9.1p11: sizeof(nullptr_t) + Align = Target.getPointerAlign(0); // == sizeof(void*) } break; case Type::FixedWidthInt: diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 77a25f6fc0..0d38dd2cd1 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1377,6 +1377,10 @@ bool Expr::isNullPointerConstant(ASTContext &Ctx) const return true; } + // C++0x nullptr_t is always a null pointer constant. + if (getType()->isNullPtrType()) + return true; + // This expression must be an integer type. if (!getType()->isIntegerType()) return false; diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index b05bf7d4ac..8176db5bf5 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -44,6 +44,14 @@ Stmt::child_iterator CXXBoolLiteralExpr::child_end() { return child_iterator(); } +// CXXNullPtrLiteralExpr +Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() { + return child_iterator(); +} +Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() { + return child_iterator(); +} + // CXXThisExpr Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); } Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); } diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index aa4920f719..34b0187970 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -299,7 +299,9 @@ public: { return APValue((Expr*)0, 0); } APValue VisitConditionalOperator(ConditionalOperator *E); APValue VisitChooseExpr(ChooseExpr *E) - { return Visit(E->getChosenSubExpr(Info.Ctx)); } + { return Visit(E->getChosenSubExpr(Info.Ctx)); } + APValue VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) + { return APValue((Expr*)0, 0); } // FIXME: Missing: @protocol, @selector }; } // end anonymous namespace diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 0f8284a2eb..cf1a255236 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -996,6 +996,10 @@ void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { OS << (Node->getValue() ? "true" : "false"); } +void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { + OS << "nullptr"; +} + void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { OS << "this"; } diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index d6cf4bd0c3..b5a884085b 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -889,6 +889,12 @@ bool Type::isPromotableIntegerType() const { return false; } +bool Type::isNullPtrType() const { + if (const BuiltinType *BT = getAsBuiltinType()) + return BT->getKind() == BuiltinType::NullPtr; + return false; +} + const char *BuiltinType::getName() const { switch (getKind()) { default: assert(0 && "Unknown builtin type!"); @@ -912,6 +918,7 @@ const char *BuiltinType::getName() const { case Double: return "double"; case LongDouble: return "long double"; case WChar: return "wchar_t"; + case NullPtr: return "nullptr_t"; case Overload: return "<overloaded function type>"; case Dependent: return "<dependent type>"; } |