aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprConstant.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-08-22 10:59:02 +0000
committerJohn McCall <rjmccall@apple.com>2010-08-22 10:59:02 +0000
commitd608cdb7c044365cf4e8764ade1e11e99c176078 (patch)
tree64048b57b20b73f88b0d6dc576241554929236cf /lib/CodeGen/CGExprConstant.cpp
parente9fd7eb6c67676dc27e84eac429aec4f3be51f26 (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.cpp18
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;