Skip to content

Commit

Permalink
[OpenCL][Sema] Improve address space support for blocks
Browse files Browse the repository at this point in the history
Summary:
This patch ensures that the following code is compiled identically with
-cl-std=CL2.0 and -fblocks -cl-std=c++.

    kernel void test(void) {
      void (^const block_A)(void) = ^{
        return;
      };
    }

A new test is not added because cl20-device-side-enqueue.cl will cover
this once blocks are further improved for C++ for OpenCL.

The changes to Sema::PerformImplicitConversion are based on
the parts of Sema::CheckAssignmentConstraints on block pointer
conversions.

Reviewers: rjmccall, Anastasia

Subscribers: yaxunl, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D64083

llvm-svn: 365500
  • Loading branch information
mantognini committed Jul 9, 2019
1 parent b00d5f7 commit d36e130
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion clang/lib/Sema/SemaExprCXX.cpp
Expand Up @@ -4216,7 +4216,20 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
break;

case ICK_Block_Pointer_Conversion: {
From = ImpCastExprToType(From, ToType.getUnqualifiedType(), CK_BitCast,
QualType LHSType = Context.getCanonicalType(ToType).getUnqualifiedType();
QualType RHSType = Context.getCanonicalType(FromType).getUnqualifiedType();

// Assumptions based on Sema::IsBlockPointerConversion.
assert(isa<BlockPointerType>(LHSType) && "BlockPointerType expected");
assert(isa<BlockPointerType>(RHSType) && "BlockPointerType expected");

LangAS AddrSpaceL =
LHSType->getAs<BlockPointerType>()->getPointeeType().getAddressSpace();
LangAS AddrSpaceR =
RHSType->getAs<BlockPointerType>()->getPointeeType().getAddressSpace();
CastKind Kind =
AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
From = ImpCastExprToType(From, ToType.getUnqualifiedType(), Kind,
VK_RValue, /*BasePath=*/nullptr, CCK).get();
break;
}
Expand Down

0 comments on commit d36e130

Please sign in to comment.