From: Yaxun Liu Date: Tue, 26 Feb 2019 16:20:41 +0000 (+0000) Subject: [PATCH] [OpenCL] Fix assertion due to blocks X-Git-Tag: archive/raspbian/1%8.0.1-9+rpi1^2~9 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=08d08597aefbb9bcd22cb992f15fdfba703a96a1;p=llvm-toolchain-8.git [PATCH] [OpenCL] Fix assertion due to blocks A recent change caused assertion in CodeGenFunction::EmitBlockCallExpr when a block is called. There is code Func = CGM.getOpenCLRuntime().getInvokeFunction(E->getCallee()); getCalleeDecl calls Expr::getReferencedDeclOfCallee, which does not handle BlockExpr and returns nullptr, which causes isa to assert. This patch fixes that. Differential Revision: https://reviews.llvm.org/D58658 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354893 91177308-0d34-0410-b5e6-96231b3b80d8 Gbp-Pq: Name OpenCL-Fix-assertion-due-to-blocks.patch --- diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 7cdd3b2c2..50a65e02b 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1359,6 +1359,8 @@ Decl *Expr::getReferencedDeclOfCallee() { return DRE->getDecl(); if (MemberExpr *ME = dyn_cast(CEE)) return ME->getMemberDecl(); + if (auto *BE = dyn_cast(CEE)) + return BE->getBlockDecl(); return nullptr; } diff --git a/clang/test/CodeGenOpenCL/blocks.cl b/clang/test/CodeGenOpenCL/blocks.cl index ab5a2c643..c3e26855d 100644 --- a/clang/test/CodeGenOpenCL/blocks.cl +++ b/clang/test/CodeGenOpenCL/blocks.cl @@ -90,6 +90,12 @@ int get42() { return blockArgFunc(^{return 42;}); } +// COMMON-LABEL: define {{.*}}@call_block +// call {{.*}}@__call_block_block_invoke +int call_block() { + return ^int(int num) { return num; } (11); +} + // CHECK-DEBUG: !DIDerivedType(tag: DW_TAG_member, name: "__size" // CHECK-DEBUG: !DIDerivedType(tag: DW_TAG_member, name: "__align"