]> granicus.if.org Git - clang/commitdiff
If we're generating code to create a pointer-to-member function
authorDouglas Gregor <dgregor@apple.com>
Mon, 3 May 2010 20:00:27 +0000 (20:00 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 3 May 2010 20:00:27 +0000 (20:00 +0000)
aggregate and the result of the aggregate is unused, bail out
early. Fixes PR7027.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102942 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprAgg.cpp
test/CodeGenCXX/member-function-pointers.cpp

index d2f75bd3552bb54b2dcb812d86d0bc94067cdc13..d1b0dff11e5a6d9f9a7487131069c3bbe9b8f008 100644 (file)
@@ -321,6 +321,11 @@ void AggExprEmitter::VisitUnaryAddrOf(const UnaryOperator *E) {
   (void) MPT;
   assert(MPT->getPointeeType()->isFunctionProtoType() &&
          "Unexpected member pointer type!");
+
+  // The creation of member function pointers has no side effects; if
+  // there is no destination pointer, we have nothing to do.
+  if (!DestPtr)
+    return;
   
   const DeclRefExpr *DRE = cast<DeclRefExpr>(E->getSubExpr());
   const CXXMethodDecl *MD = 
@@ -329,6 +334,7 @@ void AggExprEmitter::VisitUnaryAddrOf(const UnaryOperator *E) {
   const llvm::Type *PtrDiffTy = 
     CGF.ConvertType(CGF.getContext().getPointerDiffType());
 
+
   llvm::Value *DstPtr = Builder.CreateStructGEP(DestPtr, 0, "dst.ptr");
   llvm::Value *FuncPtr;
   
index a1f4daec8e72ad3357496476ceaa79338806ba9e..e4beee15bb17864439ac470b913ae9da1bb96eea 100644 (file)
@@ -184,3 +184,9 @@ namespace PR6258 {
     void (A::*pf)(bool) = &A::f;
   }
 }
+
+// PR7027 
+namespace PR7027 {
+  struct X { void test( ); };
+  void testX() { &X::test; }
+}