]> granicus.if.org Git - clang/commitdiff
Push checking down, also, give the user a hit as to which part of the
authorMike Stump <mrs@apple.com>
Mon, 2 Mar 2009 03:04:42 +0000 (03:04 +0000)
committerMike Stump <mrs@apple.com>
Mon, 2 Mar 2009 03:04:42 +0000 (03:04 +0000)
block literal is causing the problem, instead of the vague reference
to the entire block literal.

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

lib/CodeGen/CGBlocks.cpp
lib/CodeGen/CGExpr.cpp
test/CodeGenObjC/blocks-unsupported.m

index a26c0709e39a41aedc780f7f354621f02971551d..e50b320a0cd21bde799e089d0649afd2e55bcff8 100644 (file)
@@ -132,42 +132,6 @@ static bool CanBlockBeGlobal(const CodeGenFunction::BlockInfo &Info)
   return Info.ByRefDeclRefs.empty() && Info.ByCopyDeclRefs.empty();
 }
 
-/// CanGenerateCodeForBlockExpr - Returns whether CodeGen for the block expr
-/// is supported. Will emit a diagnostic and return false if not.
-/// FIXME: Once we support everything this should of course be removed.
-static bool CanGenerateCodeForBlockExpr(CodeGenFunction &CGF, 
-                                        const BlockExpr* BE, 
-                                        const CodeGenFunction::BlockInfo &Info)
-{
-  if (!Info.ByRefDeclRefs.empty()) {
-    CGF.ErrorUnsupported(BE, "block expression with __block variables");
-    return false;
-  }
-  
-  for (size_t I = 0, E = Info.ByCopyDeclRefs.size(); I != E; ++I) {
-    const BlockDeclRefExpr *E = Info.ByCopyDeclRefs[I];
-    
-    if (E->getType()->isBlockPointerType()) {
-      CGF.ErrorUnsupported(BE, "block expression with imported block");
-      return false;
-    }
-    
-    if (E->getDecl()->getAttr<ObjCNSObjectAttr>() || 
-        CGF.getContext().isObjCNSObjectType(E->getType())) {
-      CGF.ErrorUnsupported(BE, "block expression with __attribute__((NSObject))"
-                           " variable");
-      return false;
-    }
-    
-    if (CGF.getContext().isObjCObjectPointerType(E->getType())) {
-      CGF.ErrorUnsupported(BE, "block expression with Objective-C variable");
-      return false;
-    }
-  }
-  
-  return true;
-}
-
 // FIXME: Push most into CGM, passing down a few bits, like current
 // function name.
 llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) {
@@ -180,9 +144,6 @@ llvm::Value *CodeGenFunction::BuildBlockLiteralTmp(const BlockExpr *BE) {
   if (CanBlockBeGlobal(Info))
     return CGM.GetAddrOfGlobalBlock(BE, Name.c_str());
     
-  if (!CanGenerateCodeForBlockExpr(*this, BE, Info))
-    return llvm::UndefValue::get(ConvertType(BE->getType()));
-  
   std::vector<llvm::Constant*> Elts;
   llvm::Constant *C;
   llvm::Value *V;
index 7e8eff3847d3c6565150c8960855220cff2463f0..5485e9eb1f6dd292b54d06ae3ed0694c7501af9a 100644 (file)
@@ -674,6 +674,17 @@ llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const BlockDeclRefExpr *E) {
   const llvm::Type *Ty;
   Ty = CGM.getTypes().ConvertType(E->getDecl()->getType());
 
+  if (E->isByRef())
+    ErrorUnsupported(E, "__block variable in block literal");
+  else if (E->getType()->isBlockPointerType())
+    ErrorUnsupported(E, "block pointer in block literal");
+  else if (E->getDecl()->getAttr<ObjCNSObjectAttr>() || 
+           getContext().isObjCNSObjectType(E->getType()))
+    ErrorUnsupported(E, "__attribute__((NSObject)) variable in block "
+                     "literal");
+  else if (getContext().isObjCObjectPointerType(E->getType()))
+    ErrorUnsupported(E, "Objective-C variable in block literal");
+
   // See if we have already allocated an offset for this variable.
   if (offset == 0) {
     // if not, allocate one now.
index b9ec336e2a7d378393f568a32f5016575e80bd14..8e43d707ed651815b0385c0438746f18cd0bb100 100644 (file)
@@ -6,29 +6,29 @@
 void t1()
 {
        __block int a;
-       ^{ a = 10; }(); // expected-error {{cannot compile this block expression with __block variables yet}}
+       ^{ a = 10; }(); // expected-error {{cannot compile this __block variable in block literal yet}}
        
        void (^block)(void);
     ^{ (void)block; }(); // expected-error {{}}
 
     struct Foo *__attribute__ ((NSObject)) foo;
-    ^{ (void)foo; }(); // expected-error {{cannot compile this block expression with __attribute__((NSObject)) variable yet}}
+    ^{ (void)foo; }(); // expected-error {{cannot compile this __attribute__((NSObject)) variable in block literal yet}}
     
     typedef struct CGColor * __attribute__ ((NSObject)) CGColorRef;
     CGColorRef color;
-    ^{ (void)color; }(); // expected-error {{cannot compile this block expression with __attribute__((NSObject)) variable yet}}
+    ^{ (void)color; }(); // expected-error {{cannot compile this __attribute__((NSObject)) variable in block literal yet}}
     
     id a1;
-    ^{ (void)a1; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
+    ^{ (void)a1; }(); // expected-error {{cannot compile this Objective-C variable in block literal yet}}
     
     Foo *a2;
-    ^{ (void)a2; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
+    ^{ (void)a2; }(); // expected-error {{cannot compile this Objective-C variable in block literal yet}}
     
     id<P> a3;
-    ^{ (void)a3; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
+    ^{ (void)a3; }(); // expected-error {{cannot compile this Objective-C variable in block literal yet}}
 
     Foo<P> *a4;
-    ^{ (void)a4; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
+    ^{ (void)a4; }(); // expected-error {{cannot compile this Objective-C variable in block literal yet}}
     
     
 }