]> granicus.if.org Git - clang/commitdiff
When checking whether to bind an expression to a temporary, don't bind Obj-C message...
authorAnders Carlsson <andersca@mac.com>
Fri, 16 Jul 2010 21:18:37 +0000 (21:18 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 16 Jul 2010 21:18:37 +0000 (21:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@108559 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp
test/CodeGenObjCXX/references.mm

index 090400fc4e235b4710ec97c3f9beac3333421a2b..a32dc53b3037e9214e11b5d99c5b50ae36e6d95c 100644 (file)
@@ -2579,29 +2579,17 @@ Sema::OwningExprResult Sema::MaybeBindToTemporary(Expr *E) {
   if (!RT)
     return Owned(E);
 
-  // If this is the result of a call expression, our source might
-  // actually be a reference, in which case we shouldn't bind.
+  // If this is the result of a call or an Objective-C message send expression,
+  // our source might actually be a reference, in which case we shouldn't bind.
   if (CallExpr *CE = dyn_cast<CallExpr>(E)) {
-    QualType Ty = CE->getCallee()->getType();
-    if (const PointerType *PT = Ty->getAs<PointerType>())
-      Ty = PT->getPointeeType();
-    else if (const BlockPointerType *BPT = Ty->getAs<BlockPointerType>())
-      Ty = BPT->getPointeeType();
-
-    const FunctionType *FTy = Ty->getAs<FunctionType>();
-    if (FTy->getResultType()->isReferenceType())
+    if (CE->getCallReturnType()->isReferenceType())
       return Owned(E);
+  } else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
+    if (const ObjCMethodDecl *MD = ME->getMethodDecl()) {
+      if (MD->getResultType()->isReferenceType())
+        return Owned(E);    
+    }
   }
-  else if (ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
-    QualType Ty = ME->getType();
-    if (const PointerType *PT = Ty->getAs<PointerType>())
-      Ty = PT->getPointeeType();
-    else if (const BlockPointerType *BPT = Ty->getAs<BlockPointerType>())
-      Ty = BPT->getPointeeType();
-    if (Ty->isReferenceType())
-      return Owned(E);    
-  }
-
 
   // That should be enough to guarantee that this type is complete.
   // If it has a trivial destructor, we can avoid the extra copy.
index c2232e2e02f85c47d3c1d1f71be8ca7b0a497559..c12abc7de94b00d87cf38af3cc451070360618e4 100644 (file)
@@ -19,6 +19,7 @@ struct A { ~A(); };
 
 // CHECK: define void @_Z1fP1B
 // CHECK: objc_msgSend to
+// CHECK-NOT: call void @_ZN1AD1Ev
 // CHECK: ret void
 void f(B* b) {
   (void)[b getA];