From: Fariborz Jahanian Date: Sat, 30 Jun 2012 00:48:59 +0000 (+0000) Subject: blocks: fixes a crash when encoding block type X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=075a54354dc6e3644b12206e5127855091783fd6;p=clang blocks: fixes a crash when encoding block type with argument type of size 0. // rdar://11777609 PR13229. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159477 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 916e7d796f..248698f45a 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -4149,6 +4149,8 @@ std::string ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr) const { E = Decl->param_end(); PI != E; ++PI) { QualType PType = (*PI)->getType(); CharUnits sz = getObjCEncodingTypeSize(PType); + if (sz.isZero()) + continue; assert (sz.isPositive() && "BlockExpr - Incomplete param type"); ParmOffset += sz; } diff --git a/test/CodeGen/block-3.c b/test/CodeGen/block-3.c index 95cb6a735c..29c1bb5803 100644 --- a/test/CodeGen/block-3.c +++ b/test/CodeGen/block-3.c @@ -6,3 +6,15 @@ int main() { __attribute__((__blocks__(byref))) int index = ({ int __a; int __b; __a < __b ? __b : __a; }); }; } + +// PR13229 +// rdar://11777609 +typedef struct {} Z; + +typedef int (^B)(Z); + +void testPR13229() { + Z z1; + B b1 = ^(Z z1) { return 1; }; + b1(z1); +}