diff options
author | John McCall <rjmccall@apple.com> | 2010-08-22 10:59:02 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-08-22 10:59:02 +0000 |
commit | d608cdb7c044365cf4e8764ade1e11e99c176078 (patch) | |
tree | 64048b57b20b73f88b0d6dc576241554929236cf /lib/CodeGen/CGExprConstant.cpp | |
parent | e9fd7eb6c67676dc27e84eac429aec4f3be51f26 (diff) |
Experiment with using first-class aggregates to represent member function
pointers. I find the resulting code to be substantially cleaner, and it
makes it very easy to use the same APIs for data member pointers (which I have
conscientiously avoided here), and it avoids a plethora of potential
inefficiencies due to excessive memory copying, but we'll have to see if it
actually works.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111776 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGExprConstant.cpp')
-rw-r--r-- | lib/CodeGen/CGExprConstant.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp index e0335b6559..b97e725ae8 100644 --- a/lib/CodeGen/CGExprConstant.cpp +++ b/lib/CodeGen/CGExprConstant.cpp @@ -460,7 +460,7 @@ public: llvm::Constant *VisitUnaryAddrOf(UnaryOperator *E) { if (const MemberPointerType *MPT = - E->getType()->getAs<MemberPointerType>()) { + E->getType()->getAs<MemberPointerType>()) { QualType T = MPT->getPointeeType(); DeclRefExpr *DRE = cast<DeclRefExpr>(E->getSubExpr()); @@ -533,13 +533,21 @@ public: llvm::StructType::get(C->getType()->getContext(), Types, false); return llvm::ConstantStruct::get(STy, Elts); } - case CastExpr::CK_NullToMemberPointer: - return CGM.getCXXABI().EmitNullMemberFunctionPointer( - E->getType()->getAs<MemberPointerType>()); + case CastExpr::CK_NullToMemberPointer: { + const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>(); + if (MPT->getPointeeType()->isFunctionType()) + return CGM.getCXXABI().EmitNullMemberFunctionPointer(MPT); + return CGM.EmitNullConstant(E->getType()); + } case CastExpr::CK_BaseToDerivedMemberPointer: { - Expr *SubExpr = E->getSubExpr(); + const MemberPointerType *MPT = E->getType()->getAs<MemberPointerType>(); + // TODO: support data-member conversions here! + if (!MPT->getPointeeType()->isFunctionType()) + return 0; + + Expr *SubExpr = E->getSubExpr(); llvm::Constant *C = CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF); if (!C) return 0; |