]> granicus.if.org Git - clang/commitdiff
[OpenCL][Sema] Improve address space support for blocks
authorMarco Antognini <marco.antognini@arm.com>
Tue, 9 Jul 2019 15:04:27 +0000 (15:04 +0000)
committerMarco Antognini <marco.antognini@arm.com>
Tue, 9 Jul 2019 15:04:27 +0000 (15:04 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365500 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp

index 32b35ba7c32b0ca9c76767195baed169c7d9f8e7..3029861f2303ae8b3814220f5d959b4ad7898019 100644 (file)
@@ -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;
   }