xref: /aosp_15_r20/external/clang/test/SemaOpenCL/cond.cl (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only
2*67e74705SXin Li
3*67e74705SXin Litypedef unsigned char uchar;
4*67e74705SXin Litypedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
5*67e74705SXin Li
6*67e74705SXin Litypedef char char2 __attribute__((ext_vector_type(2)));
7*67e74705SXin Litypedef char char3 __attribute__((ext_vector_type(3)));
8*67e74705SXin Li
9*67e74705SXin Litypedef int int2 __attribute__((ext_vector_type(2)));
10*67e74705SXin Li
11*67e74705SXin Litypedef float float2 __attribute__((ext_vector_type(2)));
12*67e74705SXin Li
13*67e74705SXin Li// ** Positive tests **
14*67e74705SXin Li
15*67e74705SXin Li// all scalars, but widths do not match.
16*67e74705SXin Liint ptest01(char C, char X, int Y)
17*67e74705SXin Li{
18*67e74705SXin Li  return C ? X : Y;
19*67e74705SXin Li}
20*67e74705SXin Li
21*67e74705SXin Lichar ptest02(int C, char X, char Y)
22*67e74705SXin Li{
23*67e74705SXin Li  return C ? X : Y;
24*67e74705SXin Li}
25*67e74705SXin Li
26*67e74705SXin Li// scalar condition and mixed-width vectors and scalars
27*67e74705SXin Liint2 ptest03(char C, char X, int2 Y)
28*67e74705SXin Li{
29*67e74705SXin Li  return C ? X : Y;
30*67e74705SXin Li}
31*67e74705SXin Li
32*67e74705SXin Li// uniform vectors
33*67e74705SXin Lichar2 ptest04(char2 X, char2 Y, char2 C)
34*67e74705SXin Li{
35*67e74705SXin Li  return C ? X : Y;
36*67e74705SXin Li}
37*67e74705SXin Li
38*67e74705SXin Li// vector condition and mixed scalar operands
39*67e74705SXin Liint2 ptest05(int2 C, int X, char Y)
40*67e74705SXin Li{
41*67e74705SXin Li  return C ? X : Y;
42*67e74705SXin Li}
43*67e74705SXin Li
44*67e74705SXin Li// vector condition and matching scalar operands
45*67e74705SXin Lifloat2 ptest06(int2 C, float X, float Y)
46*67e74705SXin Li{
47*67e74705SXin Li  return C ? X : Y;
48*67e74705SXin Li}
49*67e74705SXin Li
50*67e74705SXin Li// vector condition and mixed scalar operands
51*67e74705SXin Lifloat2 ptest07(int2 C, int X, float Y)
52*67e74705SXin Li{
53*67e74705SXin Li  return C ? X : Y;
54*67e74705SXin Li}
55*67e74705SXin Li
56*67e74705SXin Li// vector condition and mixed scalar and vector operands
57*67e74705SXin Lifloat2 ptest08(int2 C, int X, float2 Y)
58*67e74705SXin Li{
59*67e74705SXin Li  return C ? X : Y;
60*67e74705SXin Li}
61*67e74705SXin Li
62*67e74705SXin Li// Actual comparison expression
63*67e74705SXin Lifloat2 ptest09(float2 A, float2 B, float2 C, float2 D)
64*67e74705SXin Li{
65*67e74705SXin Li  return A < B ? C : D;
66*67e74705SXin Li}
67*67e74705SXin Li
68*67e74705SXin Li// ** Negative tests **
69*67e74705SXin Li
70*67e74705SXin Liint2 ntest01(char2 C, int X, int Y)
71*67e74705SXin Li{
72*67e74705SXin Li  return C ? X : Y; // expected-error {{vector condition type 'char2' (vector of 2 'char' values) and result type (vector of 2 'int' values) do not have elements of the same size}}
73*67e74705SXin Li}
74*67e74705SXin Li
75*67e74705SXin Liint2 ntest02(char2 C, int2 X, int2 Y)
76*67e74705SXin Li{
77*67e74705SXin Li  return C ? X : Y; // expected-error {{vector condition type 'char2' (vector of 2 'char' values) and result type 'int2' (vector of 2 'int' values) do not have elements of the same size}}
78*67e74705SXin Li}
79*67e74705SXin Li
80*67e74705SXin Liuchar2 ntest03(int2 C, uchar X, uchar Y)
81*67e74705SXin Li{
82*67e74705SXin Li  return C ? X : Y; // expected-error {{vector condition type 'int2' (vector of 2 'int' values) and result type (vector of 2 'unsigned char' values) do not have elements of the same size}}
83*67e74705SXin Li}
84*67e74705SXin Li
85*67e74705SXin Lifloat2 ntest04(int2 C, int2 X, float2 Y)
86*67e74705SXin Li{
87*67e74705SXin Li  return C ? X : Y; // expected-error {{implicit conversions between vector types ('int2' (vector of 2 'int' values) and 'float2' (vector of 2 'float' values)) are not permitted}}
88*67e74705SXin Li}
89*67e74705SXin Li
90*67e74705SXin Lifloat2 ntest05(int2 C, int2 X, float Y)
91*67e74705SXin Li{
92*67e74705SXin Li  return C ? X : Y; // expected-error {{cannot convert between vector values of different size ('int2' (vector of 2 'int' values) and 'float')}}
93*67e74705SXin Li}
94*67e74705SXin Li
95*67e74705SXin Lichar2 ntest06(int2 C, char2 X, char2 Y)
96*67e74705SXin Li{
97*67e74705SXin Li  return C ? X : Y; // expected-error {{vector condition type 'int2' (vector of 2 'int' values) and result type 'char2' (vector of 2 'char' values) do not have elements of the same size}}
98*67e74705SXin Li}
99*67e74705SXin Li
100*67e74705SXin Lifloat ntest07(float C, float X, float Y)
101*67e74705SXin Li{
102*67e74705SXin Li  return C ? X : Y; // expected-error {{used type 'float' where floating point type is not allowed}}
103*67e74705SXin Li}
104*67e74705SXin Li
105*67e74705SXin Lifloat2 ntest08(float2 C, float2 X, float2 Y)
106*67e74705SXin Li{
107*67e74705SXin Li  return C ? X : Y; // expected-error {{used type 'float2' (vector of 2 'float' values) where floating point type is not allowed}}
108*67e74705SXin Li}
109*67e74705SXin Li
110*67e74705SXin Li// Trying to create a int2 vector out of pointers.
111*67e74705SXin Liint2 ntest09(int2 C, global int *X, global int *Y)
112*67e74705SXin Li{
113*67e74705SXin Li  return C ? X : Y; // expected-error {{used type '__global int *' where integer or floating point type is required}}
114*67e74705SXin Li}
115*67e74705SXin Li
116*67e74705SXin Lichar3 ntest10(char C, char3 X, char2 Y)
117*67e74705SXin Li{
118*67e74705SXin Li  return C ? X : Y; // expected-error {{implicit conversions between vector types ('char3' (vector of 3 'char' values) and 'char2' (vector of 2 'char' values)) are not permitted}}
119*67e74705SXin Li}
120*67e74705SXin Li
121*67e74705SXin Lichar3 ntest11(char2 C, char3 X, char Y)
122*67e74705SXin Li{
123*67e74705SXin Li  return C ? X : Y; // expected-error {{vector condition type 'char2' (vector of 2 'char' values) and result type 'char3' (vector of 3 'char' values) do not have the same number of elements}}
124*67e74705SXin Li}
125*67e74705SXin Li
126*67e74705SXin Liint foo1(int);
127*67e74705SXin Liint foo2(int);
128*67e74705SXin Li
129*67e74705SXin Liunsigned int ntest12(int2 C)
130*67e74705SXin Li{
131*67e74705SXin Li  return (unsigned int)(C ? foo1 : foo2); // expected-error {{taking address of function is not allowed}} expected-error {{taking address of function is not allowed}}
132*67e74705SXin Li}
133