From a1dee5300b3a0ad0c6e763d83d528ab0e6fc9c78 Mon Sep 17 00:00:00 2001 From: John McCall Date: Sun, 22 Aug 2010 10:59:02 +0000 Subject: 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. llvm-svn: 111776 --- clang/lib/CodeGen/CGExprConstant.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'clang/lib/CodeGen/CGExprConstant.cpp') diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index e0335b6559b..b97e725ae8e 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -460,7 +460,7 @@ public: llvm::Constant *VisitUnaryAddrOf(UnaryOperator *E) { if (const MemberPointerType *MPT = - E->getType()->getAs()) { + E->getType()->getAs()) { QualType T = MPT->getPointeeType(); DeclRefExpr *DRE = cast(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()); + case CastExpr::CK_NullToMemberPointer: { + const MemberPointerType *MPT = E->getType()->getAs(); + 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(); + // 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; -- cgit v1.2.3