| // RUN: %clang_cc1 -triple spirv64-intel %s -emit-llvm -o - | FileCheck %s | |
| // Test that function pointer casts properly handle address space conversions | |
| // on targets like spirv64-intel that use a non-default program address space. | |
| void foo() {} | |
| // CHECK-LABEL: define spir_func void @_Z21test_func_to_void_ptrv() addrspace(9) | |
| void test_func_to_void_ptr() { | |
| void *ptr = (void*)foo; | |
| // CHECK: store ptr addrspace(4) addrspacecast (ptr addrspace(9) @_Z3foov to ptr addrspace(4)) | |
| } | |
| // CHECK-LABEL: define spir_func void @_Z21test_void_ptr_to_funcv() addrspace(9) | |
| void test_void_ptr_to_func() { | |
| void *ptr = (void*)foo; | |
| void (*fptr)() = (void (*)())ptr; | |
| // CHECK: addrspacecast ptr addrspace(4) %{{.*}} to ptr addrspace(9) | |
| fptr(); | |
| } | |
| // CHECK-LABEL: define spir_func void @_Z25cxx_test_func_to_void_ptrv() addrspace(9) | |
| void cxx_test_func_to_void_ptr() { | |
| void *ptr = reinterpret_cast<void*>(foo); | |
| // CHECK: store ptr addrspace(4) addrspacecast (ptr addrspace(9) @_Z3foov to ptr addrspace(4)) | |
| } | |
| // CHECK-LABEL: define spir_func void @_Z25cxx_test_void_ptr_to_funcv() addrspace(9) | |
| void cxx_test_void_ptr_to_func() { | |
| void *ptr = reinterpret_cast<void*>(foo); | |
| void (*fptr)() = reinterpret_cast<void (*)()>(ptr); | |
| // CHECK: addrspacecast ptr addrspace(4) %{{.*}} to ptr addrspace(9) | |
| fptr(); | |
| } |