1 // RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify=com %s 2 // RUN: %clang_cc1 -std=c++17 -fsyntax-only -fcuda-is-device -verify=com,dev %s 3 4 #include "Inputs/cuda.h" 5 6 auto global_lambda = [] () { return 123; }; 7 8 template<class F> 9 __global__ void kernel(F f) { f(); } 10 // dev-note@-1 7{{called by 'kernel<(lambda}} 11 12 __host__ __device__ void hd(int x); 13 14 class A { 15 int b; 16 public: 17 void test() { 18 [=](){ hd(b); }(); 19 20 [&](){ hd(b); }(); 21 22 kernel<<<1,1>>>([](){ hd(0); }); 23 24 kernel<<<1,1>>>([=](){ hd(b); }); 25 // dev-error@-1 {{capture host side class data member by this pointer in device or host device lambda function}} 26 27 kernel<<<1,1>>>([&](){ hd(b); }); 28 // dev-error@-1 {{capture host side class data member by this pointer in device or host device lambda function}} 29 30 kernel<<<1,1>>>([&] __device__ (){ hd(b); }); 31 // dev-error@-1 {{capture host side class data member by this pointer in device or host device lambda function}} 32 33 kernel<<<1,1>>>([&](){ 34 auto f = [&]{ hd(b); }; 35 // dev-error@-1 {{capture host side class data member by this pointer in device or host device lambda function}} 36 f(); 37 }); 38 } 39 }; 40 41 int main(void) { 42 auto lambda_kernel = [&]__global__(){}; 43 // com-error@-1 {{kernel function 'operator()' must be a free function or static member function}} 44 45 int b; 46 [&](){ hd(b); }(); 47 48 [=, &b](){ hd(b); }(); 49 50 kernel<<<1,1>>>(global_lambda); 51 52 kernel<<<1,1>>>([](){ hd(0); }); 53 54 kernel<<<1,1>>>([=](){ hd(b); }); 55 56 kernel<<<1,1>>>([b](){ hd(b); }); 57 58 kernel<<<1,1>>>([&](){ hd(b); }); 59 // dev-error@-1 {{capture host variable 'b' by reference in device or host device lambda function}} 60 61 kernel<<<1,1>>>([=, &b](){ hd(b); }); 62 // dev-error@-1 {{capture host variable 'b' by reference in device or host device lambda function}} 63 64 kernel<<<1,1>>>([&, b](){ hd(b); }); 65 66 kernel<<<1,1>>>([&](){ 67 auto f = [&]{ hd(b); }; 68 // dev-error@-1 {{capture host variable 'b' by reference in device or host device lambda function}} 69 f(); 70 }); 71 72 return 0; 73 } 74