rsmith added inline comments.
================ Comment at: clang/lib/Sema/SemaDeclCXX.cpp:15162-15170 + bool SkipDtorChecks = VD->getType()->isArrayType(); + + // CUDA: Skip destructor checks for host-only variables during device-side + // compilation + SkipDtorChecks |= + (LangOpts.CUDAIsDevice && VD->hasGlobalStorage() && + !(VD->hasAttr<CUDADeviceAttr>() || VD->hasAttr<CUDAConstantAttr>() || ---------------- tra wrote: > rsmith wrote: > > Is this safe? What happens if the destructor for the variable is a > > template, and instantiating that template results in a reference to a > > device function? Eg: > > > > ``` > > template<typename T> __device__ void f() {} > > template<typename T> struct A { > > ~A() { f<<<>>>(); } > > }; > > A a; > > ``` > This is business as usual -- we catch it during host compilation, where `a` > is instantiated. > > ``` > h.cu:3:10: error: no matching function for call to 'f' > ~A() { f<T>(); } > ^~~~ > h.cu:5:8: note: in instantiation of member function 'A<int>::~A' requested > here > A<int> a; > ^ > h.cu:1:51: note: candidate function not viable: call to __device__ function > from __host__ function > template<typename T> __attribute__((device)) void f() {} > > 1 error generated when compiling for host. > ``` > > If it were a `__device__ A<int> a;` , then we catch it during GPU compilation > and also complain that we can't have dynamic initializers. > Sorry, testcase wasn't quite right; I meant for `f` to be `__global__` not `__device__` so that the kernel call to it works. Fixed example: ``` extern "C" int cudaConfigureCall(int a, int b); template<typename T> __attribute__((__global__)) void f(T) {} template<typename T> struct A { ~A() { f<<<1, 1>>>(T()); } }; A<int> a; ``` I think that this is valid. In order for it to work, we need to trigger instantiation of `f<int>` on the device side of the compilation. In order to do that, we need to trigger instantiation of `A<int>::~A()`, so we need to mark it referenced on the device side. (This is, I think, in line with the general principle that we want to do the same template instantiations of host functions on both sides of the compilation, so that both sides agree on which kernel functions are referenced.) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D94732/new/ https://reviews.llvm.org/D94732 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits