diff options
author | Anders Carlsson <andersca@mac.com> | 2009-08-09 18:26:27 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-08-09 18:26:27 +0000 |
commit | 237957c45774713f81fbd5394b3db4317fef0938 (patch) | |
tree | dc262157e60d9a731c838e41b49593980c283fc8 /lib/CodeGen/CGExprConstant.cpp | |
parent | 25b4fdb9d63095448e6cbc97b8865b36b0c8cbb6 (diff) |
Improve handling of member pointers.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78536 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index 047fecdc20..d8fc314689 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -773,7 +773,27 @@ llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E, } llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) { - // Always return an LLVM null constant for now; this will change when we - // get support for IRGen of member pointers. + if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) { + + QualType ElementTy = CAT->getElementType(); + + // FIXME: Handle arrays of structs that contain member pointers. + if (Context.getBaseElementType(ElementTy)->isMemberPointerType()) { + llvm::Constant *Element = EmitNullConstant(ElementTy); + uint64_t NumElements = CAT->getSize().getZExtValue(); + std::vector<llvm::Constant *> Array(NumElements); + for (uint64_t i = 0; i != NumElements; ++i) + Array[i] = Element; + + const llvm::ArrayType *ATy = + cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T)); + return llvm::ConstantArray::get(ATy, Array); + } + } + + // FIXME: Handle structs that contain member pointers. + if (T->isMemberPointerType()) + return llvm::Constant::getAllOnesValue(getTypes().ConvertTypeForMem(T)); + return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T)); } |