From ce4528f008f597585571f34c8ebd0e3a82b19b38 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Sat, 23 Aug 2008 19:35:47 +0000 Subject: [PATCH] Add CodeGen support for CXXZeroInitValueExpr. llvm-svn: 55249 --- clang/lib/AST/Expr.cpp | 3 +++ clang/lib/CodeGen/CGExprComplex.cpp | 6 ++++++ clang/lib/CodeGen/CGExprConstant.cpp | 3 +++ clang/lib/CodeGen/CGExprScalar.cpp | 3 +++ clang/test/CodeGen/cxx-value-init.cpp | 11 +++++++++++ 5 files changed, 26 insertions(+) create mode 100644 clang/test/CodeGen/cxx-value-init.cpp diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index a01832f2ee9a..b004bde7bd28 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -720,6 +720,9 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, Result.setIsUnsigned(!getType()->isSignedIntegerType()); break; } + case CXXZeroInitValueExprClass: + Result.clear(); + break; case TypesCompatibleExprClass: { const TypesCompatibleExpr *TCE = cast(this); Result.zextOrTrunc(static_cast(Ctx.getTypeSize(getType()))); diff --git a/clang/lib/CodeGen/CGExprComplex.cpp b/clang/lib/CodeGen/CGExprComplex.cpp index ba384e7f4ff6..3e1f695c79e9 100644 --- a/clang/lib/CodeGen/CGExprComplex.cpp +++ b/clang/lib/CodeGen/CGExprComplex.cpp @@ -124,6 +124,12 @@ public: ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { return Visit(DAE->getExpr()); } + ComplexPairTy VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { + assert(E->getType()->isAnyComplexType() && "Expected complex type!"); + QualType Elem = E->getType()->getAsComplexType()->getElementType(); + llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem)); + return ComplexPairTy(Null, Null); + } struct BinOpInfo { ComplexPairTy LHS; diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index fe9b5c951354..9f94d4244f07 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -61,6 +61,9 @@ public: llvm::Constant *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); } + llvm::Constant *VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { + return llvm::Constant::getNullValue(ConvertType(E->getType())); + } llvm::Constant *VisitObjCStringLiteral(const ObjCStringLiteral *E) { std::string S(E->getString()->getStrData(), E->getString()->getByteLength()); diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp index 3f7b7377523f..af8fe2779b21 100644 --- a/clang/lib/CodeGen/CGExprScalar.cpp +++ b/clang/lib/CodeGen/CGExprScalar.cpp @@ -109,6 +109,9 @@ public: Value *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); } + Value *VisitCXXZeroInitValueExpr(const CXXZeroInitValueExpr *E) { + return llvm::Constant::getNullValue(ConvertType(E->getType())); + } Value *VisitTypesCompatibleExpr(const TypesCompatibleExpr *E) { return llvm::ConstantInt::get(ConvertType(E->getType()), CGF.getContext().typesAreCompatible( diff --git a/clang/test/CodeGen/cxx-value-init.cpp b/clang/test/CodeGen/cxx-value-init.cpp new file mode 100644 index 000000000000..b1cddd913fbe --- /dev/null +++ b/clang/test/CodeGen/cxx-value-init.cpp @@ -0,0 +1,11 @@ +// RUN: clang -emit-llvm %s -o %t + +enum E {}; +int v1 = E(); +float v2 = float(); + +void f() { + int v3 = int(); + _Complex int v4 = typeof(_Complex int)(); + _Complex float v5 = typeof(_Complex float)(); +} -- GitLab