зеркало из https://github.com/microsoft/clang-1.git
Fixed a block regression caused by trying to use
an existing ir for load of a bock variable. This cannot be done across basic blocks. Fixes radar 8064140. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105549 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
43859f66cd
Коммит
19739ae839
|
@ -612,9 +612,6 @@ void CodeGenFunction::AllocateBlockDecl(const BlockDeclRefExpr *E) {
|
|||
|
||||
llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const ValueDecl *VD,
|
||||
bool IsByRef) {
|
||||
llvm::Value *&VE = BlockDeclsValue[VD];
|
||||
if (VE)
|
||||
return VE;
|
||||
|
||||
CharUnits offset = BlockDecls[VD];
|
||||
assert(!offset.isZero() && "getting address of unallocated decl");
|
||||
|
@ -648,7 +645,6 @@ llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const ValueDecl *VD,
|
|||
if (VD->getType()->isReferenceType())
|
||||
V = Builder.CreateLoad(V, "ref.tmp");
|
||||
}
|
||||
VE = V;
|
||||
return V;
|
||||
}
|
||||
|
||||
|
|
|
@ -181,9 +181,6 @@ public:
|
|||
/// BlockDecls - Offsets for all Decls in BlockDeclRefExprs.
|
||||
llvm::DenseMap<const Decl*, CharUnits> BlockDecls;
|
||||
|
||||
/// BlockDeclsValue - llvm::Value for all Decls in BlockDeclRefExprs.
|
||||
llvm::DenseMap<const Decl*, llvm::Value *> BlockDeclsValue;
|
||||
|
||||
/// BlockCXXThisOffset - The offset of the C++ 'this' value within
|
||||
/// the block structure.
|
||||
CharUnits BlockCXXThisOffset;
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -fblocks -o %t %s
|
||||
|
||||
// rdar: // 8064140
|
||||
|
||||
@interface IDEWorkspaceDocument
|
||||
{
|
||||
id _defaultEditorStateTree;
|
||||
}
|
||||
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, unsigned char *stop))block ;
|
||||
@end
|
||||
|
||||
|
||||
|
||||
int foo();
|
||||
extern void DVT (volatile const void * object, volatile const void * selector, const char * functionName);
|
||||
@implementation IDEWorkspaceDocument
|
||||
|
||||
- (void)stateSavingDefaultEditorStatesForURLs {
|
||||
[_defaultEditorStateTree enumerateKeysAndObjectsUsingBlock:^(id identifier, id urlsToEditorStates, unsigned char *stop) {
|
||||
do{
|
||||
if (foo() )
|
||||
DVT(&self,&_cmd,__PRETTY_FUNCTION__);
|
||||
|
||||
}while(0);
|
||||
|
||||
do{
|
||||
DVT(&self,&_cmd,__PRETTY_FUNCTION__);
|
||||
}while(0);
|
||||
|
||||
|
||||
}];
|
||||
|
||||
}
|
||||
|
||||
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, unsigned char *stop))block {}
|
||||
|
||||
@end
|
Загрузка…
Ссылка в новой задаче