// RUN: %clang_cc1 -x hip %s --hipstdpar -triple amdgcn-amd-amdhsa --std=c++17 \ // RUN: -fcuda-is-device -emit-llvm -o /dev/null -verify // Note: These would happen implicitly, within the implementation of the // accelerator specific algorithm library, and not from user code. // Calls from the accelerator side to implicitly host (i.e. unannotated) // functions are fine. // expected-no-diagnostics #define __device__ __attribute__((device)) #define __global__ __attribute__((global)) extern "C" void host_fn() {} struct Dummy {}; struct S { S() {} ~S() { host_fn(); } int x; }; struct T { __device__ void hd() { host_fn(); } __device__ void hd3(); void h() {} void operator+(); void operator-(const T&) {} operator Dummy() { return Dummy(); } }; __device__ void T::hd3() { host_fn(); } template __device__ void hd2() { host_fn(); } __global__ void kernel() { hd2(); } __device__ void hd() { host_fn(); } template __device__ void hd3() { host_fn(); } __device__ void device_fn() { hd3(); } __device__ void local_var() { S s; } __device__ void explicit_destructor(S *s) { s->~S(); } __device__ void hd_member_fn() { T t; t.hd(); } __device__ void h_member_fn() { T t; t.h(); } __device__ void unaryOp() { T t; (void) +t; } __device__ void binaryOp() { T t; (void) (t - t); } __device__ void implicitConversion() { T t; Dummy d = t; } template struct TmplStruct { template __device__ void fn() {} }; template <> template <> __device__ void TmplStruct::fn() { host_fn(); } __device__ void double_specialization() { TmplStruct().fn(); }