When emitting l-values for bool non-__block decl references, make a pointer

using the memory type;  fixes an assert.

Fixes rdar://problem/8605032



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117610 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
John McCall 2010-10-28 21:37:57 +00:00
Родитель b14eed0ed4
Коммит 46ec70e2e6
2 изменённых файлов: 8 добавлений и 1 удалений

Просмотреть файл

@ -611,7 +611,7 @@ llvm::Value *CodeGenFunction::GetAddrOfBlockDecl(const ValueDecl *VD,
if (VD->getType()->isReferenceType())
V = Builder.CreateLoad(V);
} else {
const llvm::Type *Ty = CGM.getTypes().ConvertType(VD->getType());
const llvm::Type *Ty = CGM.getTypes().ConvertTypeForMem(VD->getType());
Ty = llvm::PointerType::get(Ty, 0);
V = Builder.CreateBitCast(V, Ty);
if (VD->getType()->isReferenceType())

Просмотреть файл

@ -33,3 +33,10 @@ typedef double ftype(double);
ftype ^test2 = ^ftype {
return 0;
};
// rdar://problem/8605032
void f3_helper(void (^)(void));
void f3() {
_Bool b = 0;
f3_helper(^{ if (b) {} });
}