12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- From 94a65066cccbe50358dca0a9da7712cf5294912a Mon Sep 17 00:00:00 2001
- From: Yaxun Liu <Yaxun.Liu@amd.com>
- Date: Tue, 26 Feb 2019 16:20:41 +0000
- Subject: [PATCH 3/3] [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
- ---
- lib/AST/Expr.cpp | 2 ++
- test/CodeGenOpenCL/blocks.cl | 6 ++++++
- 2 files changed, 8 insertions(+)
- diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
- index 7cdd3b2c2a..50a65e02bf 100644
- --- a/lib/AST/Expr.cpp
- +++ b/lib/AST/Expr.cpp
- @@ -1359,6 +1359,8 @@ Decl *Expr::getReferencedDeclOfCallee() {
- return DRE->getDecl();
- if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
- return ME->getMemberDecl();
- + if (auto *BE = dyn_cast<BlockExpr>(CEE))
- + return BE->getBlockDecl();
-
- return nullptr;
- }
- diff --git a/test/CodeGenOpenCL/blocks.cl b/test/CodeGenOpenCL/blocks.cl
- index ab5a2c643c..c3e26855df 100644
- --- a/test/CodeGenOpenCL/blocks.cl
- +++ b/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"
-
- --
- 2.21.0
|