summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGBlocks.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-04-11 17:55:15 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-04-11 17:55:15 +0000
commitaae4349df9ac74d2e5b70117002dcda56254d3ea (patch)
treee3ebd70059c98c77d1d54069eded187de701e8b6 /clang/lib/CodeGen/CGBlocks.cpp
parent9edfeed6b8e15ca8745933a53a54637c7e57ea94 (diff)
downloadbcm5719-llvm-aae4349df9ac74d2e5b70117002dcda56254d3ea.tar.gz
bcm5719-llvm-aae4349df9ac74d2e5b70117002dcda56254d3ea.zip
Fixes a ir-gen crash for K&R style blocks.
llvm-svn: 68865
Diffstat (limited to 'clang/lib/CodeGen/CGBlocks.cpp')
-rw-r--r--clang/lib/CodeGen/CGBlocks.cpp21
1 files changed, 16 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp
index 4e9419ed204..d705af1b33a 100644
--- a/clang/lib/CodeGen/CGBlocks.cpp
+++ b/clang/lib/CodeGen/CGBlocks.cpp
@@ -623,8 +623,19 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
.getTypeStoreSizeInBits(CGM.getGenericExtendedBlockLiteralType()) / 8;
BlockAlign = getContext().getTypeAlign(getContext().VoidPtrTy) / 8;
- const FunctionProtoType *FTy =
- cast<FunctionProtoType>(BExpr->getFunctionType());
+ const FunctionType *BlockFunctionType = BExpr->getFunctionType();
+ QualType ResultType;
+ bool IsVariadic;
+ if (!isa<FunctionNoProtoType>(BlockFunctionType)) {
+ const FunctionProtoType *FTy = cast<FunctionProtoType>(BlockFunctionType);
+ ResultType = FTy->getResultType();
+ IsVariadic = FTy->isVariadic();
+ }
+ else {
+ // K&R style block.
+ ResultType = BlockFunctionType->getResultType();
+ IsVariadic = false;
+ }
FunctionArgList Args;
@@ -644,18 +655,18 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
Args.push_back(std::make_pair(*i, (*i)->getType()));
const CGFunctionInfo &FI =
- CGM.getTypes().getFunctionInfo(FTy->getResultType(), Args);
+ CGM.getTypes().getFunctionInfo(ResultType, Args);
std::string Name = std::string("__") + Info.Name + "_block_invoke_";
CodeGenTypes &Types = CGM.getTypes();
- const llvm::FunctionType *LTy = Types.GetFunctionType(FI, FTy->isVariadic());
+ const llvm::FunctionType *LTy = Types.GetFunctionType(FI, IsVariadic);
llvm::Function *Fn =
llvm::Function::Create(LTy, llvm::GlobalValue::InternalLinkage,
Name,
&CGM.getModule());
- StartFunction(BD, FTy->getResultType(), Fn, Args,
+ StartFunction(BD, ResultType, Fn, Args,
BExpr->getBody()->getLocEnd());
CurFuncDecl = OuterFuncDecl;
EmitStmt(BExpr->getBody());
OpenPOWER on IntegriCloud