Files
clang-p2996/clang/test/CodeGenOpenCLCXX/addrspace-constructors.clcpp
Ole Strohm b102e6880a [OpenCL] Fix overloading resolution of addrspace constructors
This fixes the prioritization of address spaces when choosing a
constructor, stopping them from being considered equally good,
which made the construction of types that could be constructed
by more than one of the constructors.

It does this by preferring the most specific address space,
which is decided by seeing if one of the address spaces is
a superset of the other, and preferring the other.

Fixes: PR50329

Reviewed By: Anastasia

Differential Revision: https://reviews.llvm.org/D102850
2021-06-11 11:12:33 +01:00

41 lines
1.2 KiB
Plaintext

// RUN: %clang_cc1 %s -emit-llvm -o - -O0 -triple spir-unknown-unknown | FileCheck %s
// CHECK: %struct.X = type { i32 }
// CHECK: @ci ={{.*}} addrspace(2) constant i32 0
// CHECK: @gi ={{.*}} addrspace(1) global i32 0
__constant int ci = 0;
__global int gi = 0;
struct X {
int x;
// Local variables are handled in local_addrspace_init.clcpp
X() /*__generic*/ : x(0) {}
X() __private : x(0) {}
X() __global : x(0) {}
constexpr X() __constant : x(0) {}
constexpr X(int x) __constant : x(x) {}
};
// CHECK: @cx1 ={{.*}} addrspace(2) constant %struct.X zeroinitializer
// CHECK: @cx2 ={{.*}} addrspace(2) constant %struct.X { i32 1 }
// CHECK: @gx ={{.*}} addrspace(1) global %struct.X zeroinitializer
__constant X cx1;
__constant X cx2(1);
__global X gx;
// CHECK: @_ZZ1kE3cx1 = internal addrspace(2) constant %struct.X zeroinitializer
// CHECK: @_ZZ1kE3cx2 = internal addrspace(2) constant %struct.X { i32 1 }
kernel void k() {
// Check that the constructor for px calls the __private constructor.
// CHECK: %px = alloca %struct.X
// CHECK-NEXT: call spir_func void @_ZN1XC1Ev(%struct.X* {{.*}}%px)
__private X px;
__constant X cx1;
__constant X cx2(1);
// CHECK-NEXT: ret void
}