diff options
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGBlocks.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index 16e926ba643..c05d3235dd8 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -412,18 +412,19 @@ const llvm::Type *BlockModule::getGenericExtendedBlockLiteralType() { /// function type for the block, including the first block literal argument. static QualType getBlockFunctionType(ASTContext &Ctx, const BlockPointerType *BPT) { - const FunctionProtoType *FTy = cast<FunctionProtoType>(BPT->getPointeeType()); + const FunctionProtoType *FTy = dyn_cast<FunctionProtoType>(BPT->getPointeeType()); + const clang::QualType ResType = BPT->getPointeeType()->getAsFunctionType()->getResultType(); llvm::SmallVector<QualType, 8> Types; Types.push_back(Ctx.getPointerType(Ctx.VoidTy)); - for (FunctionProtoType::arg_type_iterator i = FTy->arg_type_begin(), - e = FTy->arg_type_end(); i != e; ++i) - Types.push_back(*i); + if (FTy) + for (FunctionProtoType::arg_type_iterator i = FTy->arg_type_begin(), + e = FTy->arg_type_end(); i != e; ++i) + Types.push_back(*i); - return Ctx.getFunctionType(FTy->getResultType(), - &Types[0], Types.size(), - FTy->isVariadic(), 0); + return Ctx.getFunctionType(ResType, &Types[0], Types.size(), + FTy && FTy->isVariadic(), 0); } RValue CodeGenFunction::EmitBlockCallExpr(const CallExpr* E) { |