teak-llvm/clang/test/Sema/zvector.c
Richard Smith c624510f13 For PR17164: split -fno-lax-vector-conversion into three different
levels:

 -- none: no lax vector conversions [new GCC default]
 -- integer: only conversions between integer vectors [old GCC default]
 -- all: all conversions between same-size vectors [Clang default]

For now, Clang still defaults to "all" mode, but per my proposal on
cfe-dev (2019-04-10) the default will be changed to "integer" as soon as
that doesn't break lots of testcases. (Eventually I'd like to change the
default to "none" to match GCC and general sanity.)

Following GCC's behavior, the driver flag -flax-vector-conversions is
translated to -flax-vector-conversions=integer.

This reinstates r371805, reverted in r371813, with an additional fix for
lldb.

llvm-svn: 371817
2019-09-13 06:02:15 +00:00

1053 lines
29 KiB
C

// RUN: %clang_cc1 -triple s390x-linux-gnu -fzvector \
// RUN: -flax-vector-conversions=none -W -Wall -Wconversion \
// RUN: -Werror -fsyntax-only -verify %s
vector signed char sc, sc2;
vector unsigned char uc, uc2;
vector bool char bc, bc2;
vector signed short ss, ss2;
vector unsigned short us, us2;
vector bool short bs, bs2;
vector signed int si, si2;
vector unsigned int ui, ui2;
vector bool int bi, bi2;
vector signed long long sl, sl2;
vector unsigned long long ul, ul2;
vector bool long long bl, bl2;
vector double fd, fd2;
vector long ll; // expected-error {{cannot use 'long' with '__vector'}}
vector float ff; // expected-error {{cannot use 'float' with '__vector'}}
signed char sc_scalar;
unsigned char uc_scalar;
signed short ss_scalar;
unsigned short us_scalar;
signed int si_scalar;
unsigned int ui_scalar;
signed long sl_scalar;
unsigned long ul_scalar;
double fd_scalar;
// Verify that __vector is also recognized
__vector signed char sc3;
__vector unsigned char uc3;
__vector bool char bc3;
__vector signed short ss3;
__vector unsigned short us3;
__vector bool short bs3;
__vector signed int si3;
__vector unsigned int ui3;
__vector bool int bi3;
__vector signed long long sl3;
__vector unsigned long long ul3;
__vector bool long long bl3;
__vector double fd3;
__vector long ll3; // expected-error {{cannot use 'long' with '__vector'}}
__vector float ff3; // expected-error {{cannot use 'float' with '__vector'}}
// Likewise for __bool
vector __bool char bc4;
vector __bool short bs4;
vector __bool int bi4;
vector __bool long long bl4;
__vector __bool char bc5;
__vector __bool short bs5;
__vector __bool int bi5;
__vector __bool long long bl5;
// Verify operation of vec_step
int res_sc[vec_step(sc) == 16 ? 1 : -1];
int res_uc[vec_step(uc) == 16 ? 1 : -1];
int res_bc[vec_step(bc) == 16 ? 1 : -1];
int res_ss[vec_step(ss) == 8 ? 1 : -1];
int res_us[vec_step(us) == 8 ? 1 : -1];
int res_bs[vec_step(bs) == 8 ? 1 : -1];
int res_si[vec_step(si) == 4 ? 1 : -1];
int res_ui[vec_step(ui) == 4 ? 1 : -1];
int res_bi[vec_step(bi) == 4 ? 1 : -1];
int res_sl[vec_step(sl) == 2 ? 1 : -1];
int res_ul[vec_step(ul) == 2 ? 1 : -1];
int res_bl[vec_step(bl) == 2 ? 1 : -1];
int res_fd[vec_step(fd) == 2 ? 1 : -1];
void foo(void)
{
// -------------------------------------------------------------------------
// Test assignment.
// -------------------------------------------------------------------------
sc = sc2;
uc = uc2;
bc = bc2;
ss = ss2;
us = us2;
bs = bs2;
si = si2;
ui = ui2;
bi = bi2;
sl = sl2;
ul = ul2;
bl = bl2;
fd = fd2;
sc = uc2; // expected-error {{incompatible type}}
sc = bc2; // expected-error {{incompatible type}}
uc = sc2; // expected-error {{incompatible type}}
uc = bc2; // expected-error {{incompatible type}}
bc = sc2; // expected-error {{incompatible type}}
bc = uc2; // expected-error {{incompatible type}}
sc = sc_scalar; // expected-error {{incompatible type}}
sc = uc_scalar; // expected-error {{incompatible type}}
uc = sc_scalar; // expected-error {{incompatible type}}
uc = uc_scalar; // expected-error {{incompatible type}}
bc = sc_scalar; // expected-error {{incompatible type}}
bc = uc_scalar; // expected-error {{incompatible type}}
sc = ss2; // expected-error {{incompatible type}}
sc = si2; // expected-error {{incompatible type}}
sc = sl2; // expected-error {{incompatible type}}
sc = fd2; // expected-error {{incompatible type}}
ss = sc2; // expected-error {{incompatible type}}
si = sc2; // expected-error {{incompatible type}}
sl = sc2; // expected-error {{incompatible type}}
fd = sc2; // expected-error {{incompatible type}}
uc = us2; // expected-error {{incompatible type}}
uc = ui2; // expected-error {{incompatible type}}
uc = ul2; // expected-error {{incompatible type}}
uc = fd2; // expected-error {{incompatible type}}
us = uc2; // expected-error {{incompatible type}}
ui = uc2; // expected-error {{incompatible type}}
ul = uc2; // expected-error {{incompatible type}}
fd = uc2; // expected-error {{incompatible type}}
bc = us2; // expected-error {{incompatible type}}
bc = ui2; // expected-error {{incompatible type}}
bc = ul2; // expected-error {{incompatible type}}
bc = fd2; // expected-error {{incompatible type}}
bs = bc2; // expected-error {{incompatible type}}
bi = bc2; // expected-error {{incompatible type}}
bl = bc2; // expected-error {{incompatible type}}
fd = bc2; // expected-error {{incompatible type}}
// -------------------------------------------------------------------------
// Test casts to same element width.
// -------------------------------------------------------------------------
sc = (vector signed char)bc2;
bc = (vector bool char)uc2;
uc = (vector unsigned char)sc2;
ss = (vector signed short)bs2;
bs = (vector bool short)us2;
us = (vector unsigned short)ss2;
si = (vector signed int)bi2;
bi = (vector bool int)ui2;
ui = (vector unsigned int)si2;
sl = (vector signed long long)bl2;
bl = (vector bool long long)ul2;
ul = (vector unsigned long long)fd2;
fd = (vector double)sl2;
// -------------------------------------------------------------------------
// Test casts to different element width.
// -------------------------------------------------------------------------
sc = (vector signed char)bs2;
bc = (vector bool char)us2;
uc = (vector unsigned char)fd2;
ss = (vector signed short)bi2;
bs = (vector bool short)ui2;
us = (vector unsigned short)fd2;
si = (vector signed int)bl2;
bi = (vector bool int)ul2;
ui = (vector unsigned int)fd2;
sl = (vector signed long long)bc2;
bl = (vector bool long long)uc2;
ul = (vector unsigned long long)sc2;
fd = (vector double)sc2;
// -------------------------------------------------------------------------
// Test ++.
// -------------------------------------------------------------------------
++sc2;
++uc2;
++bc2; // expected-error {{cannot increment}}
++ss2;
++us2;
++bs2; // expected-error {{cannot increment}}
++si2;
++ui2;
++bi2; // expected-error {{cannot increment}}
++sl2;
++ul2;
++bl2; // expected-error {{cannot increment}}
++fd2;
sc++;
uc++;
bc++; // expected-error {{cannot increment}}
ss++;
us++;
bs++; // expected-error {{cannot increment}}
si++;
ui++;
bi++; // expected-error {{cannot increment}}
sl++;
ul++;
bl++; // expected-error {{cannot increment}}
fd++;
// -------------------------------------------------------------------------
// Test --.
// -------------------------------------------------------------------------
--sc2;
--uc2;
--bc2; // expected-error {{cannot decrement}}
--ss2;
--us2;
--bs2; // expected-error {{cannot decrement}}
--si2;
--ui2;
--bi2; // expected-error {{cannot decrement}}
--sl2;
--ul2;
--bl2; // expected-error {{cannot decrement}}
--fd2;
sc--;
uc--;
bc--; // expected-error {{cannot decrement}}
ss--;
us--;
bs--; // expected-error {{cannot decrement}}
si--;
ui--;
bi--; // expected-error {{cannot decrement}}
sl--;
ul--;
bl--; // expected-error {{cannot decrement}}
fd--;
// -------------------------------------------------------------------------
// Test unary +.
// -------------------------------------------------------------------------
sc = +sc2;
uc = +uc2;
bc = +bc2; // expected-error {{invalid argument type}}
ss = +ss2;
us = +us2;
bs = +bs2; // expected-error {{invalid argument type}}
si = +si2;
ui = +ui2;
bi = +bi2; // expected-error {{invalid argument type}}
sl = +sl2;
ul = +ul2;
bl = +bl2; // expected-error {{invalid argument type}}
fd = +fd2;
sc = +si2; // expected-error {{assigning to}}
ui = +si2; // expected-error {{assigning to}}
ui = +bi2; // expected-error {{invalid argument type}}
// -------------------------------------------------------------------------
// Test unary -.
// -------------------------------------------------------------------------
sc = -sc2;
uc = -uc2;
bc = -bc2; // expected-error {{invalid argument type}}
ss = -ss2;
us = -us2;
bs = -bs2; // expected-error {{invalid argument type}}
si = -si2;
ui = -ui2;
bi = -bi2; // expected-error {{invalid argument type}}
sl = -sl2;
ul = -ul2;
bl = -bl2; // expected-error {{invalid argument type}}
fd = -fd2;
sc = -si2; // expected-error {{assigning to}}
ui = -si2; // expected-error {{assigning to}}
ui = -bi2; // expected-error {{invalid argument type}}
// -------------------------------------------------------------------------
// Test ~.
// -------------------------------------------------------------------------
sc = ~sc2;
uc = ~uc2;
bc = ~bc2;
ss = ~ss2;
us = ~us2;
bs = ~bs2;
si = ~si2;
ui = ~ui2;
bi = ~bi2;
sl = ~sl2;
ul = ~ul2;
bl = ~bl2;
fd = ~fd2; // expected-error {{invalid argument}}
sc = ~si2; // expected-error {{assigning to}}
ui = ~si2; // expected-error {{assigning to}}
ui = ~bi2; // expected-error {{assigning to}}
// -------------------------------------------------------------------------
// Test binary +.
// -------------------------------------------------------------------------
sc = sc + sc2;
sc = sc + uc2; // expected-error {{cannot convert}}
sc = uc + sc2; // expected-error {{cannot convert}}
sc = sc + bc2;
sc = bc + sc2;
uc = uc + uc2;
uc = sc + uc2; // expected-error {{cannot convert}}
uc = uc + sc2; // expected-error {{cannot convert}}
uc = bc + uc2;
uc = uc + bc2;
bc = bc + bc2; // expected-error {{invalid operands}}
bc = bc + uc2; // expected-error {{incompatible type}}
bc = uc + bc2; // expected-error {{incompatible type}}
bc = bc + sc2; // expected-error {{incompatible type}}
bc = sc + bc2; // expected-error {{incompatible type}}
sc = sc + sc_scalar;
sc = sc + uc_scalar; // expected-error {{cannot convert between scalar type 'unsigned char' and vector type '__vector signed char' (vector of 16 'signed char' values) as implicit conversion would cause truncation}}
sc = sc_scalar + sc;
sc = uc_scalar + sc; // expected-error {{cannot convert between scalar type 'unsigned char' and vector type '__vector signed char' (vector of 16 'signed char' values) as implicit conversion would cause truncation}}
uc = uc + sc_scalar; // expected-error {{implicit conversion changes signedness: 'signed char' to '__vector unsigned char' (vector of 16 'unsigned char' values)}}
uc = uc + uc_scalar;
uc = sc_scalar + uc; // expected-error {{implicit conversion changes signedness: 'signed char' to '__vector unsigned char' (vector of 16 'unsigned char' values)}}
uc = uc_scalar + uc;
ss = ss + ss2;
us = us + us2;
bs = bs + bs2; // expected-error {{invalid operands}}
si = si + si2;
ui = ui + ui2;
bi = bi + bi2; // expected-error {{invalid operands}}
sl = sl + sl2;
ul = ul + ul2;
bl = bl + bl2; // expected-error {{invalid operands}}
fd = fd + fd2;
fd = fd + ul2; // expected-error {{cannot convert}}
fd = sl + fd2; // expected-error {{cannot convert}}
sc += sc2;
sc += uc2; // expected-error {{cannot convert}}
sc += bc2;
uc += uc2;
uc += sc2; // expected-error {{cannot convert}}
uc += bc2;
bc += bc2; // expected-error {{invalid operands}}
bc += sc2; // expected-error {{cannot convert}}
bc += uc2; // expected-error {{cannot convert}}
sc += ss2; // expected-error {{cannot convert}}
sc += si2; // expected-error {{cannot convert}}
sc += sl2; // expected-error {{cannot convert}}
sc += fd2; // expected-error {{cannot convert}}
sc += sc_scalar;
sc += uc_scalar; // expected-error {{cannot convert between scalar type 'unsigned char' and vector type '__vector signed char' (vector of 16 'signed char' values) as implicit conversion would cause truncation}}
uc += sc_scalar; // expected-error {{implicit conversion changes signedness: 'signed char' to '__vector unsigned char' (vector of 16 'unsigned char' values)}}
uc += uc_scalar;
ss += ss2;
us += us2;
bs += bs2; // expected-error {{invalid operands}}
si += si2;
ui += ui2;
bi += bi2; // expected-error {{invalid operands}}
sl += sl2;
ul += ul2;
bl += bl2; // expected-error {{invalid operands}}
fd += fd2;
// -------------------------------------------------------------------------
// Test that binary + rules apply to binary - too.
// -------------------------------------------------------------------------
sc = sc - sc2;
uc = uc - uc2;
bc = bc - bc2; // expected-error {{invalid operands}}
sc = uc - sc2; // expected-error {{cannot convert}}
sc = sc - bc2;
uc = bc - uc2;
sc -= sc2;
uc -= uc2;
bc -= bc2; // expected-error {{invalid operands}}
sc -= uc2; // expected-error {{cannot convert}}
uc -= bc2;
bc -= sc2; // expected-error {{cannot convert}}
ss -= ss2;
us -= us2;
bs -= bs2; // expected-error {{invalid operands}}
si -= si2;
ui -= ui2;
bi -= bi2; // expected-error {{invalid operands}}
sl -= sl2;
ul -= ul2;
bl -= bl2; // expected-error {{invalid operands}}
fd -= fd2;
// -------------------------------------------------------------------------
// Test that binary + rules apply to * too. 64-bit integer multiplication
// is not required by the spec and so isn't tested here.
// -------------------------------------------------------------------------
sc = sc * sc2;
uc = uc * uc2;
bc = bc * bc2; // expected-error {{invalid operands}}
sc = uc * sc2; // expected-error {{cannot convert}}
sc = sc * bc2; // expected-error {{cannot convert}}
uc = bc * uc2; // expected-error {{cannot convert}}
sc *= sc2;
uc *= uc2;
bc *= bc2; // expected-error {{invalid operands}}
sc *= uc2; // expected-error {{cannot convert}}
uc *= bc2; // expected-error {{cannot convert}}
bc *= sc2; // expected-error {{cannot convert}}
ss *= ss2;
us *= us2;
bs *= bs2; // expected-error {{invalid operands}}
si *= si2;
ui *= ui2;
bi *= bi2; // expected-error {{invalid operands}}
sl *= sl2;
ul *= ul2;
bl *= bl2; // expected-error {{invalid operands}}
fd *= fd2;
// -------------------------------------------------------------------------
// Test that * rules apply to / too.
// -------------------------------------------------------------------------
sc = sc / sc2;
uc = uc / uc2;
bc = bc / bc2; // expected-error {{invalid operands}}
sc = uc / sc2; // expected-error {{cannot convert}}
sc = sc / bc2; // expected-error {{cannot convert}}
uc = bc / uc2; // expected-error {{cannot convert}}
sc /= sc2;
uc /= uc2;
bc /= bc2; // expected-error {{invalid operands}}
sc /= uc2; // expected-error {{cannot convert}}
uc /= bc2; // expected-error {{cannot convert}}
bc /= sc2; // expected-error {{cannot convert}}
ss /= ss2;
us /= us2;
bs /= bs2; // expected-error {{invalid operands}}
si /= si2;
ui /= ui2;
bi /= bi2; // expected-error {{invalid operands}}
sl /= sl2;
ul /= ul2;
bl /= bl2; // expected-error {{invalid operands}}
fd /= fd2;
// -------------------------------------------------------------------------
// Test that / rules apply to % too, except that doubles are not allowed.
// -------------------------------------------------------------------------
sc = sc % sc2;
uc = uc % uc2;
bc = bc % bc2; // expected-error {{invalid operands}}
sc = uc % sc2; // expected-error {{cannot convert}}
sc = sc % bc2; // expected-error {{cannot convert}}
uc = bc % uc2; // expected-error {{cannot convert}}
sc %= sc2;
uc %= uc2;
bc %= bc2; // expected-error {{invalid operands}}
sc %= uc2; // expected-error {{cannot convert}}
uc %= bc2; // expected-error {{cannot convert}}
bc %= sc2; // expected-error {{cannot convert}}
ss %= ss2;
us %= us2;
bs %= bs2; // expected-error {{invalid operands}}
si %= si2;
ui %= ui2;
bi %= bi2; // expected-error {{invalid operands}}
sl %= sl2;
ul %= ul2;
bl %= bl2; // expected-error {{invalid operands}}
fd %= fd2; // expected-error {{invalid operands}}
// -------------------------------------------------------------------------
// Test &.
// -------------------------------------------------------------------------
sc = sc & sc2;
sc = sc & uc2; // expected-error {{cannot convert}}
sc = uc & sc2; // expected-error {{cannot convert}}
sc = sc & bc2;
sc = bc & sc2;
uc = uc & uc2;
uc = sc & uc2; // expected-error {{cannot convert}}
uc = uc & sc2; // expected-error {{cannot convert}}
uc = bc & uc2;
uc = uc & bc2;
bc = bc & bc2;
bc = bc & uc2; // expected-error {{incompatible type}}
bc = uc & bc2; // expected-error {{incompatible type}}
bc = bc & sc2; // expected-error {{incompatible type}}
bc = sc & bc2; // expected-error {{incompatible type}}
fd = fd & fd2; // expected-error {{invalid operands}}
fd = bl & fd2; // expected-error {{invalid operands}}
fd = fd & bl2; // expected-error {{invalid operands}}
fd = fd & sl2; // expected-error {{invalid operands}}
fd = fd & ul2; // expected-error {{invalid operands}}
sc &= sc2;
sc &= uc2; // expected-error {{cannot convert}}
sc &= bc2;
uc &= uc2;
uc &= sc2; // expected-error {{cannot convert}}
uc &= bc2;
bc &= bc2;
bc &= sc2; // expected-error {{cannot convert}}
bc &= uc2; // expected-error {{cannot convert}}
sc &= ss2; // expected-error {{cannot convert}}
sc &= si2; // expected-error {{cannot convert}}
sc &= sl2; // expected-error {{cannot convert}}
sc &= fd2; // expected-error {{invalid operands}}
us &= bc2; // expected-error {{cannot convert}}
ui &= bc2; // expected-error {{cannot convert}}
ul &= bc2; // expected-error {{cannot convert}}
fd &= bc2; // expected-error {{invalid operands}}
ss &= ss2;
us &= us2;
bs &= bs2;
si &= si2;
ui &= ui2;
bi &= bi2;
sl &= sl2;
ul &= ul2;
bl &= bl2;
// -------------------------------------------------------------------------
// Test that & rules apply to | too.
// -------------------------------------------------------------------------
sc = sc | sc2;
sc = sc | uc2; // expected-error {{cannot convert}}
sc = sc | bc2;
uc = uc | uc2;
uc = sc | uc2; // expected-error {{cannot convert}}
uc = bc | uc2;
bc = bc | bc2;
bc = uc | bc2; // expected-error {{incompatible type}}
bc = bc | sc2; // expected-error {{incompatible type}}
fd = fd | fd2; // expected-error {{invalid operands}}
fd = bl | fd2; // expected-error {{invalid operands}}
ss |= ss2;
us |= us2;
bs |= bs2;
si |= si2;
ui |= ui2;
bi |= bi2;
sl |= sl2;
ul |= ul2;
bl |= bl2;
fd |= bl2; // expected-error {{invalid operands}}
fd |= fd2; // expected-error {{invalid operands}}
// -------------------------------------------------------------------------
// Test that & rules apply to ^ too.
// -------------------------------------------------------------------------
sc = sc ^ sc2;
sc = sc ^ uc2; // expected-error {{cannot convert}}
sc = sc ^ bc2;
uc = uc ^ uc2;
uc = sc ^ uc2; // expected-error {{cannot convert}}
uc = bc ^ uc2;
bc = bc ^ bc2;
bc = uc ^ bc2; // expected-error {{incompatible type}}
bc = bc ^ sc2; // expected-error {{incompatible type}}
fd = fd ^ fd2; // expected-error {{invalid operands}}
fd = bl ^ fd2; // expected-error {{invalid operands}}
ss ^= ss2;
us ^= us2;
bs ^= bs2;
si ^= si2;
ui ^= ui2;
bi ^= bi2;
sl ^= sl2;
ul ^= ul2;
bl ^= bl2;
fd ^= bl2; // expected-error {{invalid operands}}
fd ^= fd2; // expected-error {{invalid operands}}
// -------------------------------------------------------------------------
// Test <<.
// -------------------------------------------------------------------------
sc = sc << sc2;
sc = sc << uc2;
sc = uc << sc2; // expected-error {{incompatible type}}
sc = sc << bc2; // expected-error {{invalid operands}}
sc = bc << sc2; // expected-error {{invalid operands}}
uc = uc << uc2;
uc = sc << uc2; // expected-error {{assigning to}}
uc = uc << sc2;
uc = bc << uc2; // expected-error {{invalid operands}}
uc = uc << bc2; // expected-error {{invalid operands}}
bc = bc << bc2; // expected-error {{invalid operands}}
bc = bc << uc2; // expected-error {{invalid operands}}
bc = uc << bc2; // expected-error {{invalid operands}}
bc = bc << sc2; // expected-error {{invalid operands}}
bc = sc << bc2; // expected-error {{invalid operands}}
sc = sc << 1;
sc = sc << 1.0f; // expected-error {{integer is required}}
sc = sc << sc_scalar;
sc = sc << uc_scalar;
sc = sc << ss_scalar;
sc = sc << us_scalar;
sc = sc << si_scalar;
sc = sc << ui_scalar;
sc = sc << sl_scalar;
sc = sc << ul_scalar;
sc = sc_scalar << sc; // expected-error {{first operand is not a vector}}
sc = uc_scalar << sc; // expected-error {{first operand is not a vector}}
uc = uc << sc_scalar;
uc = uc << uc_scalar;
uc = sc_scalar << uc; // expected-error {{first operand is not a vector}}
uc = uc_scalar << uc; // expected-error {{first operand is not a vector}}
ss = ss << ss2;
ss = ss << ss_scalar;
us = us << us2;
us = us << us_scalar;
bs = bs << bs2; // expected-error {{invalid operands}}
si = si << si2;
si = si << si_scalar;
ui = ui << ui2;
ui = ui << ui_scalar;
bi = bi << bi2; // expected-error {{invalid operands}}
sl = sl << sl2;
sl = sl << sl_scalar;
ul = ul << ul2;
ul = ul << ul_scalar;
bl = bl << bl2; // expected-error {{invalid operands}}
fd = fd << fd2; // expected-error {{integer is required}}
fd = fd << ul2; // expected-error {{integer is required}}
fd = sl << fd2; // expected-error {{integer is required}}
sc <<= sc2;
sc <<= uc2;
sc <<= bc2; // expected-error {{invalid operands}}
sc <<= sc_scalar;
uc <<= uc2;
uc <<= sc2;
uc <<= bc2; // expected-error {{invalid operands}}
uc <<= uc_scalar;
bc <<= bc2; // expected-error {{invalid operands}}
bc <<= sc2; // expected-error {{invalid operands}}
bc <<= uc2; // expected-error {{invalid operands}}
sc <<= ss2; // expected-error {{vector operands do not have the same number of elements}}
sc <<= si2; // expected-error {{vector operands do not have the same number of elements}}
sc <<= sl2; // expected-error {{vector operands do not have the same number of elements}}
sc <<= fd2; // expected-error {{integer is required}}
ss <<= ss2;
ss <<= ss_scalar;
us <<= us2;
us <<= us_scalar;
bs <<= bs2; // expected-error {{invalid operands}}
si <<= si2;
si <<= si_scalar;
ui <<= ui2;
ui <<= ui_scalar;
bi <<= bi2; // expected-error {{invalid operands}}
sl <<= sl2;
sl <<= sl_scalar;
ul <<= ul2;
ul <<= ul_scalar;
bl <<= bl2; // expected-error {{invalid operands}}
fd <<= fd2; // expected-error {{integer is required}}
// -------------------------------------------------------------------------
// Test >>.
// -------------------------------------------------------------------------
sc = sc >> sc2;
sc = sc >> uc2;
sc = uc >> sc2; // expected-error {{incompatible type}}
sc = sc >> bc2; // expected-error {{invalid operands}}
sc = bc >> sc2; // expected-error {{invalid operands}}
uc = uc >> uc2;
uc = sc >> uc2; // expected-error {{assigning to}}
uc = uc >> sc2;
uc = bc >> uc2; // expected-error {{invalid operands}}
uc = uc >> bc2; // expected-error {{invalid operands}}
bc = bc >> bc2; // expected-error {{invalid operands}}
bc = bc >> uc2; // expected-error {{invalid operands}}
bc = uc >> bc2; // expected-error {{invalid operands}}
bc = bc >> sc2; // expected-error {{invalid operands}}
bc = sc >> bc2; // expected-error {{invalid operands}}
sc = sc >> 1;
sc = sc >> 1.0f; // expected-error {{integer is required}}
sc = sc >> sc_scalar;
sc = sc >> uc_scalar;
sc = sc >> ss_scalar;
sc = sc >> us_scalar;
sc = sc >> si_scalar;
sc = sc >> ui_scalar;
sc = sc >> sl_scalar;
sc = sc >> ul_scalar;
sc = sc_scalar >> sc; // expected-error {{first operand is not a vector}}
sc = uc_scalar >> sc; // expected-error {{first operand is not a vector}}
uc = uc >> sc_scalar;
uc = uc >> uc_scalar;
uc = sc_scalar >> uc; // expected-error {{first operand is not a vector}}
uc = uc_scalar >> uc; // expected-error {{first operand is not a vector}}
ss = ss >> ss2;
ss = ss >> ss_scalar;
us = us >> us2;
us = us >> us_scalar;
bs = bs >> bs2; // expected-error {{invalid operands}}
si = si >> si2;
si = si >> si_scalar;
ui = ui >> ui2;
ui = ui >> ui_scalar;
bi = bi >> bi2; // expected-error {{invalid operands}}
sl = sl >> sl2;
sl = sl >> sl_scalar;
ul = ul >> ul2;
ul = ul >> ul_scalar;
bl = bl >> bl2; // expected-error {{invalid operands}}
fd = fd >> fd2; // expected-error {{integer is required}}
fd = fd >> ul2; // expected-error {{integer is required}}
fd = sl >> fd2; // expected-error {{integer is required}}
sc >>= sc2;
sc >>= uc2;
sc >>= bc2; // expected-error {{invalid operands}}
sc >>= sc_scalar;
uc >>= uc2;
uc >>= sc2;
uc >>= bc2; // expected-error {{invalid operands}}
uc >>= uc_scalar;
bc >>= bc2; // expected-error {{invalid operands}}
bc >>= sc2; // expected-error {{invalid operands}}
bc >>= uc2; // expected-error {{invalid operands}}
sc >>= ss2; // expected-error {{vector operands do not have the same number of elements}}
sc >>= si2; // expected-error {{vector operands do not have the same number of elements}}
sc >>= sl2; // expected-error {{vector operands do not have the same number of elements}}
sc >>= fd2; // expected-error {{integer is required}}
ss >>= ss2;
ss >>= ss_scalar;
us >>= us2;
us >>= us_scalar;
bs >>= bs2; // expected-error {{invalid operands}}
si >>= si2;
si >>= si_scalar;
ui >>= ui2;
ui >>= ui_scalar;
bi >>= bi2; // expected-error {{invalid operands}}
sl >>= sl2;
sl >>= sl_scalar;
ul >>= ul2;
ul >>= ul_scalar;
bl >>= bl2; // expected-error {{invalid operands}}
fd >>= fd2; // expected-error {{integer is required}}
// -------------------------------------------------------------------------
// Test ==.
// -------------------------------------------------------------------------
(void)(sc == sc2);
(void)(uc == uc2);
(void)(bc == bc2);
(void)(sc == uc); // expected-error {{cannot convert}}
(void)(sc == bc);
(void)(uc == sc); // expected-error {{cannot convert}}
(void)(uc == bc);
(void)(bc == sc);
(void)(bc == uc);
(void)(ss == ss2);
(void)(us == us2);
(void)(bs == bs2);
(void)(si == si2);
(void)(ui == ui2);
(void)(bi == bi2);
(void)(sl == sl2);
(void)(ul == ul2);
(void)(bl == bl2);
(void)(fd == fd2);
(void)(fd == ul); // expected-error {{cannot convert}}
(void)(ul == fd); // expected-error {{cannot convert}}
// -------------------------------------------------------------------------
// Test that == rules apply to != too.
// -------------------------------------------------------------------------
(void)(sc != sc2);
(void)(uc != uc2);
(void)(bc != bc2);
(void)(sc != uc); // expected-error {{cannot convert}}
(void)(sc != bc);
(void)(ss != ss2);
(void)(us != us2);
(void)(bs != bs2);
(void)(si != si2);
(void)(ui != ui2);
(void)(bi != bi2);
(void)(sl != sl2);
(void)(ul != ul2);
(void)(bl != bl2);
(void)(fd != fd2);
// -------------------------------------------------------------------------
// Test that == rules apply to <= too.
// -------------------------------------------------------------------------
(void)(sc <= sc2);
(void)(uc <= uc2);
(void)(bc <= bc2);
(void)(sc <= uc); // expected-error {{cannot convert}}
(void)(sc <= bc);
(void)(ss <= ss2);
(void)(us <= us2);
(void)(bs <= bs2);
(void)(si <= si2);
(void)(ui <= ui2);
(void)(bi <= bi2);
(void)(sl <= sl2);
(void)(ul <= ul2);
(void)(bl <= bl2);
(void)(fd <= fd2);
// -------------------------------------------------------------------------
// Test that == rules apply to >= too.
// -------------------------------------------------------------------------
(void)(sc >= sc2);
(void)(uc >= uc2);
(void)(bc >= bc2);
(void)(sc >= uc); // expected-error {{cannot convert}}
(void)(sc >= bc);
(void)(ss >= ss2);
(void)(us >= us2);
(void)(bs >= bs2);
(void)(si >= si2);
(void)(ui >= ui2);
(void)(bi >= bi2);
(void)(sl >= sl2);
(void)(ul >= ul2);
(void)(bl >= bl2);
(void)(fd >= fd2);
// -------------------------------------------------------------------------
// Test that == rules apply to < too.
// -------------------------------------------------------------------------
(void)(sc < sc2);
(void)(uc < uc2);
(void)(bc < bc2);
(void)(sc < uc); // expected-error {{cannot convert}}
(void)(sc < bc);
(void)(ss < ss2);
(void)(us < us2);
(void)(bs < bs2);
(void)(si < si2);
(void)(ui < ui2);
(void)(bi < bi2);
(void)(sl < sl2);
(void)(ul < ul2);
(void)(bl < bl2);
(void)(fd < fd2);
// -------------------------------------------------------------------------
// Test that == rules apply to > too.
// -------------------------------------------------------------------------
(void)(sc > sc2);
(void)(uc > uc2);
(void)(bc > bc2);
(void)(sc > uc); // expected-error {{cannot convert}}
(void)(sc > bc);
(void)(ss > ss2);
(void)(us > us2);
(void)(bs > bs2);
(void)(si > si2);
(void)(ui > ui2);
(void)(bi > bi2);
(void)(sl > sl2);
(void)(ul > ul2);
(void)(bl > bl2);
(void)(fd > fd2);
}