From 31937a5f7cb689377ff39397f4d0a8cff22d7359 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Mon, 2 Mar 2009 03:04:42 +0000 Subject: [PATCH] Push checking down, also, give the user a hit as to which part of the 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 | 39 --------------------------- lib/CodeGen/CGExpr.cpp | 11 ++++++++ test/CodeGenObjC/blocks-unsupported.m | 14 +++++----- 3 files changed, 18 insertions(+), 46 deletions(-) diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index a26c0709e3..e50b320a0c 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -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() || - 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 Elts; llvm::Constant *C; llvm::Value *V; diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 7e8eff3847..5485e9eb1f 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -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() || + 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. diff --git a/test/CodeGenObjC/blocks-unsupported.m b/test/CodeGenObjC/blocks-unsupported.m index b9ec336e2a..8e43d707ed 100644 --- a/test/CodeGenObjC/blocks-unsupported.m +++ b/test/CodeGenObjC/blocks-unsupported.m @@ -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

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

*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}} } -- 2.40.0