Adding couple of Block API, a bug fix and
a test change, all for blocks. wip.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118745 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp
index 44e0833..3364687 100644
--- a/lib/CodeGen/CGBlocks.cpp
+++ b/lib/CodeGen/CGBlocks.cpp
@@ -311,11 +311,10 @@
       }
 
       const BlockDeclRefExpr *BDRE = cast<BlockDeclRefExpr>(E);
+      Note.RequiresCopying = BlockRequiresCopying(BDRE);
+      
       const ValueDecl *VD = BDRE->getDecl();
       QualType T = VD->getType();
-
-      Note.RequiresCopying = BlockRequiresCopying(T);
-
       if (BDRE->isByRef()) {
         Note.flag = BLOCK_FIELD_IS_BYREF;
         if (T.isObjCGCWeak())
@@ -563,7 +562,7 @@
   // Don't run the expensive check, unless we have to.
   if (!BlockHasCopyDispose)
     if (E->isByRef()
-        || BlockRequiresCopying(E->getType()))
+        || BlockRequiresCopying(E))
       BlockHasCopyDispose = true;
 
   const ValueDecl *D = cast<ValueDecl>(E->getDecl());
diff --git a/lib/CodeGen/CGBlocks.h b/lib/CodeGen/CGBlocks.h
index 743e3c8..ce721a4 100644
--- a/lib/CodeGen/CGBlocks.h
+++ b/lib/CodeGen/CGBlocks.h
@@ -103,6 +103,9 @@
 
   bool BlockRequiresCopying(QualType Ty)
     { return getContext().BlockRequiresCopying(Ty); }
+  bool BlockRequiresCopying(const BlockDeclRefExpr *E)
+  { return E->getCopyConstructorExpr() != 0 ||
+           getContext().BlockRequiresCopying(E->getType()); }
 };
 
 class BlockFunction : public BlockBase {
@@ -197,6 +200,9 @@
 
   bool BlockRequiresCopying(QualType Ty)
     { return getContext().BlockRequiresCopying(Ty); }
+  bool BlockRequiresCopying(const BlockDeclRefExpr *E)
+  { return E->getCopyConstructorExpr() != 0 ||
+           getContext().BlockRequiresCopying(E->getType()); }
 };
 
 }  // end namespace CodeGen
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 790f883..8da3846 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1911,16 +1911,18 @@
         Expr *E = new (Context) 
                     DeclRefExpr(const_cast<ValueDecl*>(BDRE->getDecl()), T,
                                           SourceLocation());
-      
-        ExprResult Res = PerformCopyInitialization(
+        if (T->getAs<RecordType>())
+          if (!T->isUnionType()) {
+            ExprResult Res = PerformCopyInitialization(
                           InitializedEntity::InitializeBlock(VD->getLocation(), 
                                                          T, false),
                                                          SourceLocation(),
                                                          Owned(E));
-        if (!Res.isInvalid()) {
-          Res = MaybeCreateCXXExprWithTemporaries(Res.get());
-          Expr *Init = Res.takeAs<Expr>();
-          BDRE->setCopyConstructorExpr(Init);
+            if (!Res.isInvalid()) {
+              Res = MaybeCreateCXXExprWithTemporaries(Res.get());
+              Expr *Init = Res.takeAs<Expr>();
+              BDRE->setCopyConstructorExpr(Init);
+            }
         }
       }
     }