tra added a reviewer: rsmith.
tra added a subscriber: rsmith.
tra added a comment.

Summoning @rsmith as I'm sure that there are interesting corner cases in lambda 
handling that we didn't consider.

Making lambdas implicitly HD will make it easier to write the code which can't 
be instantiated on one side of the compilation. That's probably observable via 
SFINAE, but I can't tell whether that matters.
By default I'd rather err on handling lambdas the same way as we do regular 
user-authored functions.



================
Comment at: clang/lib/Sema/SemaCUDA.cpp:722
+  if (getLangOpts().HIP) {
+    Method->addAttr(CUDADeviceAttr::CreateImplicit(Context));
+    Method->addAttr(CUDAHostAttr::CreateImplicit(Context));
----------------
What about `__global__` lambdas? We probably don't want to add HD attributes on 
them here.


================
Comment at: clang/test/CodeGenCUDA/lambda.cu:16-26
+template<class F>
+__global__ void g(F f) { f(); }
+
+template<class F>
+void h(F f) { g<<<1,1>>>(f); }
+
+__device__ int a;
----------------
The test example may not be doing what it's seemingly supposed to be doing:
https://cppinsights.io/s/3a5c42ff

`h()` gets a temporary host-side object which keeps the reference to `a` and 
that reference will actually point to the host-side shadow of the actual 
device-side `a`. When you get to execute `g` it's `this` may not be very usable 
on device side and thus `f.operator()` will probably not work.

Alas, we currently have no diagnostics for that kind of error.

Change it to a non-capturing lambda, perhaps?


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

https://reviews.llvm.org/D78655



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

Reply via email to