xref: /llvm-project/clang/test/Sema/zvector2.c (revision f73e87f53f5d8a86c29251dedc9dbd264179203a)
1 // RUN: %clang_cc1 -triple s390x-linux-gnu -fzvector -target-cpu z14 \
2 // RUN:  -flax-vector-conversions=none -W -Wall -Wconversion \
3 // RUN:  -Werror -fsyntax-only -verify %s
4 
5 vector signed char sc, sc2;
6 vector unsigned char uc, uc2;
7 vector bool char bc, bc2;
8 
9 vector signed short ss, ss2;
10 vector unsigned short us, us2;
11 vector bool short bs, bs2;
12 
13 vector signed int si, si2;
14 vector unsigned int ui, ui2;
15 vector bool int bi, bi2;
16 
17 vector signed long long sl, sl2;
18 vector unsigned long long ul, ul2;
19 vector bool long long bl, bl2;
20 
21 vector double fd, fd2;
22 
23 vector float ff, ff2;
24 
25 // Verify that __vector is also recognized
26 __vector float ff3;
27 
28 // With z14 we support vector float, but still no vector _Complex float.
29 vector float _Complex cf; // expected-error {{cannot use '_Complex' with '__vector'}}
30 __vector float _Complex cf3; // expected-error {{cannot use '_Complex' with '__vector'}}
31 
32 // Verify operation of vec_step
33 int res_ff[vec_step(ff) == 4 ? 1 : -1];
34 
35 
foo(void)36 void foo(void)
37 {
38   // -------------------------------------------------------------------------
39   // Test assignment.
40   // -------------------------------------------------------------------------
41 
42   ff = ff2;
43 
44   sc = ff2; // expected-error {{incompatible type}}
45   ff = sc2; // expected-error {{incompatible type}}
46 
47   uc = ff2; // expected-error {{incompatible type}}
48   ff = uc2; // expected-error {{incompatible type}}
49 
50   bc = ff2; // expected-error {{incompatible type}}
51   ff = bc2; // expected-error {{incompatible type}}
52 
53   fd = ff2; // expected-error {{incompatible type}}
54   ff = fd2; // expected-error {{incompatible type}}
55 
56   // -------------------------------------------------------------------------
57   // Test casts to same element width.
58   // -------------------------------------------------------------------------
59 
60   ui = (vector unsigned int)ff2;
61   ff = (vector float)si2;
62 
63   // -------------------------------------------------------------------------
64   // Test casts to different element width.
65   // -------------------------------------------------------------------------
66 
67   uc = (vector unsigned char)ff2;
68   us = (vector unsigned short)ff2;
69   ul = (vector unsigned long long)ff2;
70 
71   ff = (vector float)sc2;
72   ff = (vector float)ss2;
73   ff = (vector float)sl2;
74 
75   // -------------------------------------------------------------------------
76   // Test unary operators.
77   // -------------------------------------------------------------------------
78 
79   ++ff2;
80   ff++;
81 
82   --ff2;
83   ff--;
84 
85   ff = +ff2;
86 
87   ff = -ff2;
88 
89   ff = ~ff2; // expected-error {{invalid argument}}
90 
91   // -------------------------------------------------------------------------
92   // Test binary arithmetic operators.
93   // -------------------------------------------------------------------------
94 
95   ff = ff + ff2;
96   ff = ff + ui2; // expected-error {{cannot convert}}
97   ff = si + ff2; // expected-error {{cannot convert}}
98   ff = fd + ff2; // expected-error {{cannot convert}}
99   ff += ff2;
100   ff += fd2; // expected-error {{cannot convert}}
101   sc += ff2; // expected-error {{cannot convert}}
102 
103   ff = ff - ff2;
104   ff = ff - ui2; // expected-error {{cannot convert}}
105   ff = si - ff2; // expected-error {{cannot convert}}
106   ff = fd - ff2; // expected-error {{cannot convert}}
107   ff -= ff2;
108   ff -= fd2; // expected-error {{cannot convert}}
109   sc -= ff2; // expected-error {{cannot convert}}
110 
111   ff = ff * ff2;
112   ff = ff * ui2; // expected-error {{cannot convert}}
113   ff = si * ff2; // expected-error {{cannot convert}}
114   ff = fd * ff2; // expected-error {{cannot convert}}
115   ff *= ff2;
116   ff *= fd2; // expected-error {{cannot convert}}
117   sc *= ff2; // expected-error {{cannot convert}}
118 
119   ff = ff / ff2;
120   ff = ff / ui2; // expected-error {{cannot convert}}
121   ff = si / ff2; // expected-error {{cannot convert}}
122   ff = fd / ff2; // expected-error {{cannot convert}}
123   ff /= ff2;
124   ff /= fd2; // expected-error {{cannot convert}}
125   sc /= ff2; // expected-error {{cannot convert}}
126 
127   ff = ff % ff2; // expected-error {{invalid operands}}
128   ff = ff % ui2; // expected-error {{invalid operands}}
129   ff = si % ff2; // expected-error {{invalid operands}}
130   ff = fd % ff2; // expected-error {{invalid operands}}
131   ff %= ff2; // expected-error {{invalid operands}}
132   ff %= fd2; // expected-error {{invalid operands}}
133   sc %= ff2; // expected-error {{invalid operands}}
134 
135   // -------------------------------------------------------------------------
136   // Test bitwise binary operators.
137   // -------------------------------------------------------------------------
138 
139   ff = ff & ff2; // expected-error {{invalid operands}}
140   ff = bi & ff2; // expected-error {{invalid operands}}
141   ff = fd & ff2; // expected-error {{invalid operands}}
142   ff = ff & bi2; // expected-error {{invalid operands}}
143   ff = ff & si2; // expected-error {{invalid operands}}
144   ff = ff & ui2; // expected-error {{invalid operands}}
145   sc &= ff2; // expected-error {{invalid operands}}
146   ff &= bc2; // expected-error {{invalid operands}}
147   ff &= fd2; // expected-error {{invalid operands}}
148 
149   ff = ff | ff2; // expected-error {{invalid operands}}
150   ff = bi | ff2; // expected-error {{invalid operands}}
151   ff = fd | ff2; // expected-error {{invalid operands}}
152   ff = ff | bi2; // expected-error {{invalid operands}}
153   ff = ff | si2; // expected-error {{invalid operands}}
154   ff = ff | ui2; // expected-error {{invalid operands}}
155   sc |= ff2; // expected-error {{invalid operands}}
156   ff |= bc2; // expected-error {{invalid operands}}
157   ff |= fd2; // expected-error {{invalid operands}}
158 
159   ff = ff ^ ff2; // expected-error {{invalid operands}}
160   ff = bi ^ ff2; // expected-error {{invalid operands}}
161   ff = fd ^ ff2; // expected-error {{invalid operands}}
162   ff = ff ^ bi2; // expected-error {{invalid operands}}
163   ff = ff ^ si2; // expected-error {{invalid operands}}
164   ff = ff ^ ui2; // expected-error {{invalid operands}}
165   sc ^= ff2; // expected-error {{invalid operands}}
166   ff ^= bc2; // expected-error {{invalid operands}}
167   ff ^= fd2; // expected-error {{invalid operands}}
168 
169   // -------------------------------------------------------------------------
170   // Test shift operators.
171   // -------------------------------------------------------------------------
172 
173   ff = ff << ff2; // expected-error {{integer is required}}
174   ff = ff << fd2; // expected-error {{integer is required}}
175   ff = ff << ui2; // expected-error {{integer is required}}
176   ff = sl << ff2; // expected-error {{integer is required}}
177   sc <<= ff2; // expected-error {{integer is required}}
178   ff <<= ff2; // expected-error {{integer is required}}
179   fd <<= ff2; // expected-error {{integer is required}}
180 
181   ff = ff >> ff2; // expected-error {{integer is required}}
182   ff = ff >> fd2; // expected-error {{integer is required}}
183   ff = ff >> ui2; // expected-error {{integer is required}}
184   ff = sl >> ff2; // expected-error {{integer is required}}
185   sc >>= ff2; // expected-error {{integer is required}}
186   ff >>= ff2; // expected-error {{integer is required}}
187   fd >>= ff2; // expected-error {{integer is required}}
188 
189   // -------------------------------------------------------------------------
190   // Test comparison operators.
191   // -------------------------------------------------------------------------
192 
193   (void)(ff == ff2);
194   (void)(ff == fd2); // expected-error {{cannot convert}}
195   (void)(ff == ui2); // expected-error {{cannot convert}}
196   (void)(ui == ff2); // expected-error {{cannot convert}}
197 
198   (void)(ff != ff2);
199   (void)(ff != fd2); // expected-error {{cannot convert}}
200   (void)(ff != ui2); // expected-error {{cannot convert}}
201   (void)(ui != ff2); // expected-error {{cannot convert}}
202 
203   (void)(ff <= ff2);
204   (void)(ff <= fd2); // expected-error {{cannot convert}}
205   (void)(ff <= ui2); // expected-error {{cannot convert}}
206   (void)(ui <= ff2); // expected-error {{cannot convert}}
207 
208   (void)(ff >= ff2);
209   (void)(ff >= fd2); // expected-error {{cannot convert}}
210   (void)(ff >= ui2); // expected-error {{cannot convert}}
211   (void)(ui >= ff2); // expected-error {{cannot convert}}
212 
213   (void)(ff < ff2);
214   (void)(ff < fd2); // expected-error {{cannot convert}}
215   (void)(ff < ui2); // expected-error {{cannot convert}}
216   (void)(ui < ff2); // expected-error {{cannot convert}}
217 
218   (void)(ff > ff2);
219   (void)(ff > fd2); // expected-error {{cannot convert}}
220   (void)(ff > ui2); // expected-error {{cannot convert}}
221   (void)(ui > ff2); // expected-error {{cannot convert}}
222 }
223