yaxunl added a comment.

In D56411#1398329 <https://reviews.llvm.org/D56411#1398329>, @rjmccall wrote:

> In D56411#1398328 <https://reviews.llvm.org/D56411#1398328>, @rjmccall wrote:
>
> > In D56411#1398291 <https://reviews.llvm.org/D56411#1398291>, @tra wrote:
> >
> > > >> That said, does CUDA have a general rule resolving `__host__` vs. 
> > > >> `__device__` overloads based on context?  And does it allow 
> > > >> overloading based solely on `__host__` vs. `__device__`?
> > >
> > > NVCC does not. Clang does. See https://goo.gl/EXnymm for the details.
> > >
> > > AFAICT, NVIDIA is starting to consider adopting Clang's approach:
> > >  http://lists.llvm.org/pipermail/cfe-dev/2018-November/060070.html 
> > > (original message from Bryce apparently didn't make it to the cfe-dev 
> > > archive)
> >
> >
> > Okay.  Probably the template-argument rule ought to be the same as the 
> > address-of-function rule, which I assume means that there's a final pass 
> > that resolves ambiguities in favor of functions that can be used from the 
> > current context, to the extent that that's meaningful.  It's hard to tell 
> > because that document does not appear to include a formal specification.
>
>
> Regardless, that has no effect on this patch.


The check for host/device to resolve template argument already exists in clang 
before this patch. This patch is trying to fix a bug in that check.
e.g.

  __device__ void f();
  __host__ void f();
  template<void (*F)()> __global__ void kernel() { F(); }
  __host__ void g() { kernel<f><<<1,1>>>(); }

Template kernel is trying to resove f, it is supposed to get `__device__ f` but 
it gets `__host__ f`, because
Sema::CheckCUDACall thinks the caller of f is g but actually the caller of f is 
the template kernel.

This check cannot be deferred to template instantiation since it is too late. 
It has to be done in
a constant evalucation context where template argument is checked. Since there 
is no existing way
to tell Sema::CheckCUDACall that clang is checking template argument, the 
template is passed through
a newly added member to ExpressionEvaluationContextRecord.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56411/new/

https://reviews.llvm.org/D56411



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to