mirror of
https://github.com/intel/llvm.git
synced 2026-02-03 02:26:27 +08:00
Emit errors about unsupported blocks features.
llvm-svn: 65751
This commit is contained in:
@@ -132,6 +132,44 @@ 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];
|
||||
|
||||
E->getType()->dump();
|
||||
|
||||
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) {
|
||||
@@ -144,6 +182,9 @@ 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;
|
||||
|
||||
34
clang/test/CodeGenObjC/blocks-unsupported.m
Normal file
34
clang/test/CodeGenObjC/blocks-unsupported.m
Normal file
@@ -0,0 +1,34 @@
|
||||
// RUN: clang -fnext-runtime --emit-llvm -o %t %s -verify
|
||||
|
||||
@class Foo;
|
||||
@protocol P;
|
||||
|
||||
void t1()
|
||||
{
|
||||
__block int a;
|
||||
^{ a = 10; }(); // expected-error {{cannot compile this block expression with __block variables 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}}
|
||||
|
||||
typedef struct CGColor * __attribute__ ((NSObject)) CGColorRef;
|
||||
CGColorRef color;
|
||||
^{ (void)color; }(); // expected-error {{cannot compile this block expression with __attribute__((NSObject)) variable yet}}
|
||||
|
||||
id a1;
|
||||
^{ (void)a1; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
|
||||
|
||||
Foo *a2;
|
||||
^{ (void)a2; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
|
||||
|
||||
id<P> a3;
|
||||
^{ (void)a3; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
|
||||
|
||||
Foo<P> *a4;
|
||||
^{ (void)a4; }(); // expected-error {{cannot compile this block expression with Objective-C variable yet}}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user