• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//RUN: %clang_cc1 %s -cl-std=clc++ -pedantic -ast-dump -verify | FileCheck %s
2//RUN: %clang_cc1 %s -cl-std=clc++ -pedantic -ast-dump -verify -triple i386-windows | FileCheck %s
3
4//CHECK: CXXMethodDecl {{.*}} constexpr operator() 'int (__private int){{.*}} const __generic'
5auto glambda = [](auto a) { return a; };
6
7__kernel void test() {
8  int i;
9//CHECK: CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __generic'
10  auto  llambda = [&]() {i++;};
11  llambda();
12  glambda(1);
13  // Test lambda with default parameters
14//CHECK: CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __generic'
15  [&] {i++;} ();
16  __constant auto err = [&]() {}; //expected-note{{candidate function not viable: 'this' object is in address space '__constant', but method expects object in address space '__generic'}}
17  err();                          //expected-error-re{{no matching function for call to object of type '__constant (lambda at {{.*}})'}}
18  // FIXME: There is very limited addr space functionality
19  // we can test when taking lambda type from the object.
20  // The limitation is due to addr spaces being added to all
21  // objects in OpenCL. Once we add metaprogramming utility
22  // for removing address spaces from a type we can enhance
23  // testing here.
24  (*(__constant decltype(llambda) *)nullptr)(); //expected-error{{multiple address spaces specified for type}}
25  (*(decltype(llambda) *)nullptr)();
26}
27
28__kernel void test_qual() {
29//CHECK: |-CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __private'
30  auto priv1 = []() __private {};
31  priv1();
32//CHECK: |-CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __generic'
33  auto priv2 = []() __generic {};
34  priv2();
35  auto priv3 = []() __global {}; //expected-note{{candidate function not viable: 'this' object is in address space '__private', but method expects object in address space '__global'}}
36#if defined(_WIN32) && !defined(_WIN64)
37  //expected-note@35{{conversion candidate of type 'void (*)() __attribute__((thiscall))'}}
38#else
39  //expected-note@35{{conversion candidate of type 'void (*)()'}}
40#endif
41  priv3(); //expected-error{{no matching function for call to object of type}}
42
43  __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'}}
44#if defined(_WIN32) && !defined(_WIN64)
45  //expected-note@43{{conversion candidate of type 'void (*)() __attribute__((thiscall))'}}
46#else
47  //expected-note@43{{conversion candidate of type 'void (*)()'}}
48#endif
49  const1(); //expected-error{{no matching function for call to object of type '__constant (lambda at}}
50  __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'}}
51#if defined(_WIN32) && !defined(_WIN64)
52  //expected-note@50{{conversion candidate of type 'void (*)() __attribute__((thiscall))'}}
53#else
54  //expected-note@50{{conversion candidate of type 'void (*)()'}}
55#endif
56  const2(); //expected-error{{no matching function for call to object of type '__constant (lambda at}}
57//CHECK: |-CXXMethodDecl {{.*}} constexpr operator() 'void () {{.*}}const __constant'
58  __constant auto const3 = []() __constant{};
59  const3();
60
61  [&] () __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'}}
62  [&] () __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'}}
63
64  [&] __private {} (); //expected-error{{lambda requires '()' before attribute specifier}} expected-error{{expected body of lambda expression}}
65
66  [&] () mutable __private {} ();
67  [&] () __private mutable {} (); //expected-error{{expected body of lambda expression}}
68}
69
70