| //RUN: %clang_cc1 %s -pedantic -ast-dump -verify | FileCheck %s | |
| //RUN: %clang_cc1 %s -pedantic -ast-dump -verify -triple i386-windows | FileCheck %s | |
| //CHECK: CXXMethodDecl {{.*}} constexpr operator() 'int (__private int){{.*}} const __generic' | |
| auto glambda = [](auto a) { return a; }; | |
| __kernel void test() { | |
| int i; | |
| //CHECK: CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __generic' | |
| auto llambda = [&]() {i++;}; | |
| llambda(); | |
| glambda(1); | |
| // Test lambda with default parameters | |
| //CHECK: CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __generic' | |
| [&] {i++;} (); | |
| __constant auto err = [&]() {}; //expected-note{{candidate function not viable: 'this' object is in address space '__constant', but method expects object in address space '__generic'}} | |
| err(); //expected-error-re{{no matching function for call to object of type '__constant (lambda at {{.*}})'}} | |
| // FIXME: There is very limited addr space functionality | |
| // we can test when taking lambda type from the object. | |
| // The limitation is due to addr spaces being added to all | |
| // objects in OpenCL. Once we add metaprogramming utility | |
| // for removing address spaces from a type we can enhance | |
| // testing here. | |
| (*(__constant decltype(llambda) *)nullptr)(); //expected-error{{multiple address spaces specified for type}} | |
| (*(decltype(llambda) *)nullptr)(); | |
| } | |
| __kernel void test_qual() { | |
| //CHECK: |-CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __private' | |
| auto priv1 = []() __private {}; | |
| priv1(); | |
| //CHECK: |-CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __generic' | |
| auto priv2 = []() __generic {}; | |
| priv2(); | |
| auto priv3 = []() __global {}; //expected-note{{candidate function not viable: 'this' object is in address space '__private', but method expects object in address space '__global'}} | |
| #if defined(_WIN32) && !defined(_WIN64) | |
| //expected-note@35{{conversion candidate of type 'void (*)() __attribute__((thiscall))'}} | |
| #else | |
| //expected-note@35{{conversion candidate of type 'void (*)()'}} | |
| #endif | |
| priv3(); //expected-error{{no matching function for call to object of type}} | |
| __constant auto const1 = []() __private{}; //expected-note{{candidate function not viable: 'this' object is in address space '__constant', but method expects object in address space '__private'}} | |
| #if defined(_WIN32) && !defined(_WIN64) | |
| //expected-note@43{{conversion candidate of type 'void (*)() __attribute__((thiscall))'}} | |
| #else | |
| //expected-note@43{{conversion candidate of type 'void (*)()'}} | |
| #endif | |
| const1(); //expected-error{{no matching function for call to object of type '__constant (lambda at}} | |
| __constant auto const2 = []() __generic{}; //expected-note{{candidate function not viable: 'this' object is in address space '__constant', but method expects object in address space '__generic'}} | |
| #if defined(_WIN32) && !defined(_WIN64) | |
| //expected-note@50{{conversion candidate of type 'void (*)() __attribute__((thiscall))'}} | |
| #else | |
| //expected-note@50{{conversion candidate of type 'void (*)()'}} | |
| #endif | |
| const2(); //expected-error{{no matching function for call to object of type '__constant (lambda at}} | |
| //CHECK: |-CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __constant' | |
| __constant auto const3 = []() __constant{}; | |
| const3(); | |
| [&] () __global {} (); //expected-error{{no matching function for call to object of type '(lambda at}} expected-note{{candidate function not viable: 'this' object is in default address space, but method expects object in address space '__global'}} | |
| [&] () __private {} (); //expected-error{{no matching function for call to object of type '(lambda at}} expected-note{{candidate function not viable: 'this' object is in default address space, but method expects object in address space '__private'}} | |
| [&] __private {} (); // expected-error{{no matching function for call to object of type '(lambda at}} expected-note{{candidate function not viable: 'this' object is in default address space, but method expects object in address space '__private'}} | |
| #if __cplusplus <= 202002L | |
| // expected-warning@-2{{lambda without a parameter clause is a C++23 extension}} | |
| #endif | |
| [&] () mutable __private {} (); | |
| [&] () __private mutable {} (); //expected-error{{expected body of lambda expression}} | |
| } | |