1*67e74705SXin Li// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only 2*67e74705SXin Li// RUN: %clang_cc1 %s -cl-std=CL2.0 -verify -pedantic -fsyntax-only -Wconversion -DWCONV 3*67e74705SXin Li 4*67e74705SXin Li// Diagnostic tests for different overloads of enqueue_kernel from Table 6.13.17.1 of OpenCL 2.0 Spec. 5*67e74705SXin Likernel void enqueue_kernel_tests() { 6*67e74705SXin Li queue_t default_queue; 7*67e74705SXin Li unsigned flags = 0; 8*67e74705SXin Li ndrange_t ndrange; 9*67e74705SXin Li clk_event_t evt; 10*67e74705SXin Li clk_event_t event_wait_list; 11*67e74705SXin Li clk_event_t event_wait_list2[] = {evt, evt}; 12*67e74705SXin Li void *vptr; 13*67e74705SXin Li 14*67e74705SXin Li // Testing the first overload type 15*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, ^(void) { 16*67e74705SXin Li return 0; 17*67e74705SXin Li }); 18*67e74705SXin Li 19*67e74705SXin Li enqueue_kernel(vptr, flags, ndrange, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected 'queue_t' argument type}} 20*67e74705SXin Li return 0; 21*67e74705SXin Li }); 22*67e74705SXin Li 23*67e74705SXin Li enqueue_kernel(default_queue, vptr, ndrange, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected 'kernel_enqueue_flags_t' (i.e. uint) argument type}} 24*67e74705SXin Li return 0; 25*67e74705SXin Li }); 26*67e74705SXin Li 27*67e74705SXin Li enqueue_kernel(default_queue, flags, vptr, ^(void) { // expected-error{{illegal call to enqueue_kernel, expected 'ndrange_t' argument type}} 28*67e74705SXin Li return 0; 29*67e74705SXin Li }); 30*67e74705SXin Li 31*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, vptr); // expected-error{{illegal call to enqueue_kernel, expected block argument}} 32*67e74705SXin Li 33*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, ^(int i) { // expected-error{{blocks in this form of device side enqueue call are expected to have have no parameters}} 34*67e74705SXin Li return 0; 35*67e74705SXin Li }); 36*67e74705SXin Li 37*67e74705SXin Li // Testing the second overload type 38*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, &evt, ^(void) { 39*67e74705SXin Li return 0; 40*67e74705SXin Li }); 41*67e74705SXin Li 42*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, vptr, &evt, ^(void) // expected-error{{illegal call to enqueue_kernel, expected 'clk_event_t *' argument type}} 43*67e74705SXin Li { 44*67e74705SXin Li return 0; 45*67e74705SXin Li }); 46*67e74705SXin Li 47*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, vptr, ^(void) // expected-error{{illegal call to enqueue_kernel, expected 'clk_event_t *' argument type}} 48*67e74705SXin Li { 49*67e74705SXin Li return 0; 50*67e74705SXin Li }); 51*67e74705SXin Li 52*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, &evt, vptr); // expected-error{{illegal call to enqueue_kernel, expected block argument}} 53*67e74705SXin Li 54*67e74705SXin Li // Testing the third overload type 55*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 56*67e74705SXin Li ^(local void *a, local void *b) { 57*67e74705SXin Li return 0; 58*67e74705SXin Li }, 59*67e74705SXin Li 1024, 1024); 60*67e74705SXin Li 61*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 62*67e74705SXin Li ^(local void *a, local void *b) { 63*67e74705SXin Li return 0; 64*67e74705SXin Li }, 65*67e74705SXin Li 1024, 1024L); // expected-error{{local memory sizes need to be specified as uint}} 66*67e74705SXin Li 67*67e74705SXin Li char c; 68*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 69*67e74705SXin Li ^(local void *a, local void *b) { 70*67e74705SXin Li return 0; 71*67e74705SXin Li }, 72*67e74705SXin Li c, 1024); 73*67e74705SXin Li#ifdef WCONV 74*67e74705SXin Li// expected-warning@-2{{implicit conversion changes signedness: 'char' to 'unsigned int'}} 75*67e74705SXin Li#endif 76*67e74705SXin Li 77*67e74705SXin Li typedef void (^bl_A_t)(local void *); 78*67e74705SXin Li 79*67e74705SXin Li const bl_A_t block_A = (bl_A_t) ^ (local void *a) {}; 80*67e74705SXin Li 81*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, block_A, 1024); 82*67e74705SXin Li 83*67e74705SXin Li typedef void (^bl_B_t)(local void *, local int *); 84*67e74705SXin Li 85*67e74705SXin Li const bl_B_t block_B = (bl_B_t) ^ (local void *a, local int *b) {}; 86*67e74705SXin Li 87*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, block_B, 1024, 1024); // expected-error{{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 88*67e74705SXin Li 89*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, // expected-error{{mismatch in number of block parameters and local size arguments passed}} 90*67e74705SXin Li ^(local void *a, local void *b) { 91*67e74705SXin Li return 0; 92*67e74705SXin Li }, 93*67e74705SXin Li 1024); 94*67e74705SXin Li 95*67e74705SXin Li float illegal_mem_size = (float)0.5f; 96*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 97*67e74705SXin Li ^(local void *a, local void *b) { 98*67e74705SXin Li return 0; 99*67e74705SXin Li }, 100*67e74705SXin Li illegal_mem_size, illegal_mem_size); // expected-error{{local memory sizes need to be specified as uint}} expected-error{{local memory sizes need to be specified as uint}} 101*67e74705SXin Li#ifdef WCONV 102*67e74705SXin Li// expected-warning@-2{{implicit conversion turns floating-point number into integer: 'float' to 'unsigned int'}} expected-warning@-2{{implicit conversion turns floating-point number into integer: 'float' to 'unsigned int'}} 103*67e74705SXin Li#endif 104*67e74705SXin Li 105*67e74705SXin Li // Testing the forth overload type 106*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, event_wait_list2, &evt, 107*67e74705SXin Li ^(local void *a, local void *b) { 108*67e74705SXin Li return 0; 109*67e74705SXin Li }, 110*67e74705SXin Li 1024, 1024); 111*67e74705SXin Li 112*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, &evt, // expected-error{{mismatch in number of block parameters and local size arguments passed}} 113*67e74705SXin Li ^(local void *a, local void *b) { 114*67e74705SXin Li return 0; 115*67e74705SXin Li }, 116*67e74705SXin Li 1024, 1024, 1024); 117*67e74705SXin Li 118*67e74705SXin Li // More random misc cases that can't be deduced 119*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, &event_wait_list, &evt); // expected-error{{illegal call to enqueue_kernel, incorrect argument types}} 120*67e74705SXin Li 121*67e74705SXin Li enqueue_kernel(default_queue, flags, ndrange, 1, 1); // expected-error{{illegal call to enqueue_kernel, incorrect argument types}} 122*67e74705SXin Li} 123*67e74705SXin Li 124*67e74705SXin Li// Diagnostic tests for get_kernel_work_group_size and allowed block parameter types in dynamic parallelism. 125*67e74705SXin Likernel void work_group_size_tests() { 126*67e74705SXin Li void (^const block_A)(void) = ^{ 127*67e74705SXin Li return; 128*67e74705SXin Li }; 129*67e74705SXin Li void (^const block_B)(int) = ^(int a) { 130*67e74705SXin Li return; 131*67e74705SXin Li }; 132*67e74705SXin Li void (^const block_C)(local void *) = ^(local void *a) { 133*67e74705SXin Li return; 134*67e74705SXin Li }; 135*67e74705SXin Li void (^const block_D)(local int *) = ^(local int *a) { 136*67e74705SXin Li return; 137*67e74705SXin Li }; 138*67e74705SXin Li 139*67e74705SXin Li unsigned size = get_kernel_work_group_size(block_A); 140*67e74705SXin Li size = get_kernel_work_group_size(block_C); 141*67e74705SXin Li size = get_kernel_work_group_size(^(local void *a) { 142*67e74705SXin Li return; 143*67e74705SXin Li }); 144*67e74705SXin Li size = get_kernel_work_group_size(^(local int *a) { // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 145*67e74705SXin Li return; 146*67e74705SXin Li }); 147*67e74705SXin Li size = get_kernel_work_group_size(block_B); // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 148*67e74705SXin Li size = get_kernel_work_group_size(block_D); // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 149*67e74705SXin Li size = get_kernel_work_group_size(^(int a) { // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 150*67e74705SXin Li return; 151*67e74705SXin Li }); 152*67e74705SXin Li size = get_kernel_work_group_size(); // expected-error {{too few arguments to function call, expected 1, have 0}} 153*67e74705SXin Li size = get_kernel_work_group_size(1); // expected-error{{expected block argument}} 154*67e74705SXin Li size = get_kernel_work_group_size(block_A, 1); // expected-error{{too many arguments to function call, expected 1, have 2}} 155*67e74705SXin Li 156*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(block_A); 157*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(block_C); 158*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(^(local void *a) { 159*67e74705SXin Li return; 160*67e74705SXin Li }); 161*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(^(local int *a) { // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 162*67e74705SXin Li return; 163*67e74705SXin Li }); 164*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(^(int a) { // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 165*67e74705SXin Li return; 166*67e74705SXin Li }); 167*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(block_B); // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 168*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(block_D); // expected-error {{blocks used in device side enqueue are expected to have parameters of type 'local void*'}} 169*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(); // expected-error {{too few arguments to function call, expected 1, have 0}} 170*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(1); // expected-error{{expected block argument}} 171*67e74705SXin Li size = get_kernel_preferred_work_group_size_multiple(block_A, 1); // expected-error{{too many arguments to function call, expected 1, have 2}} 172*67e74705SXin Li} 173