summaryrefslogtreecommitdiffstats
path: root/clang/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
commita1dee5300b3a0ad0c6e763d83d528ab0e6fc9c78 (patch)
tree2bce21ec67c8ff401bc950847fa406094f814865 /clang/lib/CodeGen/CGExprConstant.cpp
parent131d97d80923ab4a068ee8a5fc3dbed5c97bd15e (diff)
downloadbcm5719-llvm-a1dee5300b3a0ad0c6e763d83d528ab0e6fc9c78.tar.gz
bcm5719-llvm-a1dee5300b3a0ad0c6e763d83d528ab0e6fc9c78.zip
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
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp18
1 files changed, 13 insertions, 5 deletions
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<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;
OpenPOWER on IntegriCloud