1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fcuda-is-device -verify %s 3 device_fn()4__attribute__((device)) void device_fn() {} hd_fn()5__attribute__((host, device)) void hd_fn() {} 6 device_attr()7__attribute__((device)) void device_attr() { 8 ([]() __attribute__((device)) { device_fn(); })(); 9 // expected-warning@-1 {{nvcc does not allow '__device__' to appear after '()' in lambdas}} 10 ([] __attribute__((device)) () { device_fn(); })(); 11 ([] __attribute__((device)) { device_fn(); })(); 12 13 ([&]() __attribute__((device)){ device_fn(); })(); 14 // expected-warning@-1 {{nvcc does not allow '__device__' to appear after '()' in lambdas}} 15 ([&] __attribute__((device)) () { device_fn(); })(); 16 ([&] __attribute__((device)) { device_fn(); })(); 17 18 ([&](int) __attribute__((device)){ device_fn(); })(0); 19 // expected-warning@-1 {{nvcc does not allow '__device__' to appear after '()' in lambdas}} 20 ([&] __attribute__((device)) (int) { device_fn(); })(0); 21 } 22 host_device_attrs()23__attribute__((host)) __attribute__((device)) void host_device_attrs() { 24 ([]() __attribute__((host)) __attribute__((device)){ hd_fn(); })(); 25 // expected-warning@-1 {{nvcc does not allow '__host__' to appear after '()' in lambdas}} 26 // expected-warning@-2 {{nvcc does not allow '__device__' to appear after '()' in lambdas}} 27 ([] __attribute__((host)) __attribute__((device)) () { hd_fn(); })(); 28 ([] __attribute__((host)) __attribute__((device)) { hd_fn(); })(); 29 30 ([&]() __attribute__((host)) __attribute__((device)){ hd_fn(); })(); 31 // expected-warning@-1 {{nvcc does not allow '__host__' to appear after '()' in lambdas}} 32 // expected-warning@-2 {{nvcc does not allow '__device__' to appear after '()' in lambdas}} 33 ([&] __attribute__((host)) __attribute__((device)) () { hd_fn(); })(); 34 ([&] __attribute__((host)) __attribute__((device)) { hd_fn(); })(); 35 36 ([&](int) __attribute__((host)) __attribute__((device)){ hd_fn(); })(0); 37 // expected-warning@-1 {{nvcc does not allow '__host__' to appear after '()' in lambdas}} 38 // expected-warning@-2 {{nvcc does not allow '__device__' to appear after '()' in lambdas}} 39 ([&] __attribute__((host)) __attribute__((device)) (int) { hd_fn(); })(0); 40 } 41 42 // TODO: Add tests for __attribute__((global)) once we support global lambdas. 43