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
219 lines
7.9 KiB
C
219 lines
7.9 KiB
C
// RUN: %clang_cc1 -triple s390x-linux-gnu -fzvector -target-cpu z14 \
|
|
// 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 float ff, ff2;
|
|
|
|
// Verify that __vector is also recognized
|
|
__vector float ff3;
|
|
|
|
// Verify operation of vec_step
|
|
int res_ff[vec_step(ff) == 4 ? 1 : -1];
|
|
|
|
|
|
void foo(void)
|
|
{
|
|
// -------------------------------------------------------------------------
|
|
// Test assignment.
|
|
// -------------------------------------------------------------------------
|
|
|
|
ff = ff2;
|
|
|
|
sc = ff2; // expected-error {{incompatible type}}
|
|
ff = sc2; // expected-error {{incompatible type}}
|
|
|
|
uc = ff2; // expected-error {{incompatible type}}
|
|
ff = uc2; // expected-error {{incompatible type}}
|
|
|
|
bc = ff2; // expected-error {{incompatible type}}
|
|
ff = bc2; // expected-error {{incompatible type}}
|
|
|
|
fd = ff2; // expected-error {{incompatible type}}
|
|
ff = fd2; // expected-error {{incompatible type}}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test casts to same element width.
|
|
// -------------------------------------------------------------------------
|
|
|
|
ui = (vector unsigned int)ff2;
|
|
ff = (vector float)si2;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test casts to different element width.
|
|
// -------------------------------------------------------------------------
|
|
|
|
uc = (vector unsigned char)ff2;
|
|
us = (vector unsigned short)ff2;
|
|
ul = (vector unsigned long long)ff2;
|
|
|
|
ff = (vector float)sc2;
|
|
ff = (vector float)ss2;
|
|
ff = (vector float)sl2;
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test unary operators.
|
|
// -------------------------------------------------------------------------
|
|
|
|
++ff2;
|
|
ff++;
|
|
|
|
--ff2;
|
|
ff--;
|
|
|
|
ff = +ff2;
|
|
|
|
ff = -ff2;
|
|
|
|
ff = ~ff2; // expected-error {{invalid argument}}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test binary arithmetic operators.
|
|
// -------------------------------------------------------------------------
|
|
|
|
ff = ff + ff2;
|
|
ff = ff + ui2; // expected-error {{cannot convert}}
|
|
ff = si + ff2; // expected-error {{cannot convert}}
|
|
ff = fd + ff2; // expected-error {{cannot convert}}
|
|
ff += ff2;
|
|
ff += fd2; // expected-error {{cannot convert}}
|
|
sc += ff2; // expected-error {{cannot convert}}
|
|
|
|
ff = ff - ff2;
|
|
ff = ff - ui2; // expected-error {{cannot convert}}
|
|
ff = si - ff2; // expected-error {{cannot convert}}
|
|
ff = fd - ff2; // expected-error {{cannot convert}}
|
|
ff -= ff2;
|
|
ff -= fd2; // expected-error {{cannot convert}}
|
|
sc -= ff2; // expected-error {{cannot convert}}
|
|
|
|
ff = ff * ff2;
|
|
ff = ff * ui2; // expected-error {{cannot convert}}
|
|
ff = si * ff2; // expected-error {{cannot convert}}
|
|
ff = fd * ff2; // expected-error {{cannot convert}}
|
|
ff *= ff2;
|
|
ff *= fd2; // expected-error {{cannot convert}}
|
|
sc *= ff2; // expected-error {{cannot convert}}
|
|
|
|
ff = ff / ff2;
|
|
ff = ff / ui2; // expected-error {{cannot convert}}
|
|
ff = si / ff2; // expected-error {{cannot convert}}
|
|
ff = fd / ff2; // expected-error {{cannot convert}}
|
|
ff /= ff2;
|
|
ff /= fd2; // expected-error {{cannot convert}}
|
|
sc /= ff2; // expected-error {{cannot convert}}
|
|
|
|
ff = ff % ff2; // expected-error {{invalid operands}}
|
|
ff = ff % ui2; // expected-error {{invalid operands}}
|
|
ff = si % ff2; // expected-error {{invalid operands}}
|
|
ff = fd % ff2; // expected-error {{invalid operands}}
|
|
ff %= ff2; // expected-error {{invalid operands}}
|
|
ff %= fd2; // expected-error {{invalid operands}}
|
|
sc %= ff2; // expected-error {{invalid operands}}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test bitwise binary operators.
|
|
// -------------------------------------------------------------------------
|
|
|
|
ff = ff & ff2; // expected-error {{invalid operands}}
|
|
ff = bi & ff2; // expected-error {{invalid operands}}
|
|
ff = fd & ff2; // expected-error {{invalid operands}}
|
|
ff = ff & bi2; // expected-error {{invalid operands}}
|
|
ff = ff & si2; // expected-error {{invalid operands}}
|
|
ff = ff & ui2; // expected-error {{invalid operands}}
|
|
sc &= ff2; // expected-error {{invalid operands}}
|
|
ff &= bc2; // expected-error {{invalid operands}}
|
|
ff &= fd2; // expected-error {{invalid operands}}
|
|
|
|
ff = ff | ff2; // expected-error {{invalid operands}}
|
|
ff = bi | ff2; // expected-error {{invalid operands}}
|
|
ff = fd | ff2; // expected-error {{invalid operands}}
|
|
ff = ff | bi2; // expected-error {{invalid operands}}
|
|
ff = ff | si2; // expected-error {{invalid operands}}
|
|
ff = ff | ui2; // expected-error {{invalid operands}}
|
|
sc |= ff2; // expected-error {{invalid operands}}
|
|
ff |= bc2; // expected-error {{invalid operands}}
|
|
ff |= fd2; // expected-error {{invalid operands}}
|
|
|
|
ff = ff ^ ff2; // expected-error {{invalid operands}}
|
|
ff = bi ^ ff2; // expected-error {{invalid operands}}
|
|
ff = fd ^ ff2; // expected-error {{invalid operands}}
|
|
ff = ff ^ bi2; // expected-error {{invalid operands}}
|
|
ff = ff ^ si2; // expected-error {{invalid operands}}
|
|
ff = ff ^ ui2; // expected-error {{invalid operands}}
|
|
sc ^= ff2; // expected-error {{invalid operands}}
|
|
ff ^= bc2; // expected-error {{invalid operands}}
|
|
ff ^= fd2; // expected-error {{invalid operands}}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test shift operators.
|
|
// -------------------------------------------------------------------------
|
|
|
|
ff = ff << ff2; // expected-error {{integer is required}}
|
|
ff = ff << fd2; // expected-error {{integer is required}}
|
|
ff = ff << ui2; // expected-error {{integer is required}}
|
|
ff = sl << ff2; // expected-error {{integer is required}}
|
|
sc <<= ff2; // expected-error {{integer is required}}
|
|
ff <<= ff2; // expected-error {{integer is required}}
|
|
fd <<= ff2; // expected-error {{integer is required}}
|
|
|
|
ff = ff >> ff2; // expected-error {{integer is required}}
|
|
ff = ff >> fd2; // expected-error {{integer is required}}
|
|
ff = ff >> ui2; // expected-error {{integer is required}}
|
|
ff = sl >> ff2; // expected-error {{integer is required}}
|
|
sc >>= ff2; // expected-error {{integer is required}}
|
|
ff >>= ff2; // expected-error {{integer is required}}
|
|
fd >>= ff2; // expected-error {{integer is required}}
|
|
|
|
// -------------------------------------------------------------------------
|
|
// Test comparison operators.
|
|
// -------------------------------------------------------------------------
|
|
|
|
(void)(ff == ff2);
|
|
(void)(ff == fd2); // expected-error {{cannot convert}}
|
|
(void)(ff == ui2); // expected-error {{cannot convert}}
|
|
(void)(ui == ff2); // expected-error {{cannot convert}}
|
|
|
|
(void)(ff != ff2);
|
|
(void)(ff != fd2); // expected-error {{cannot convert}}
|
|
(void)(ff != ui2); // expected-error {{cannot convert}}
|
|
(void)(ui != ff2); // expected-error {{cannot convert}}
|
|
|
|
(void)(ff <= ff2);
|
|
(void)(ff <= fd2); // expected-error {{cannot convert}}
|
|
(void)(ff <= ui2); // expected-error {{cannot convert}}
|
|
(void)(ui <= ff2); // expected-error {{cannot convert}}
|
|
|
|
(void)(ff >= ff2);
|
|
(void)(ff >= fd2); // expected-error {{cannot convert}}
|
|
(void)(ff >= ui2); // expected-error {{cannot convert}}
|
|
(void)(ui >= ff2); // expected-error {{cannot convert}}
|
|
|
|
(void)(ff < ff2);
|
|
(void)(ff < fd2); // expected-error {{cannot convert}}
|
|
(void)(ff < ui2); // expected-error {{cannot convert}}
|
|
(void)(ui < ff2); // expected-error {{cannot convert}}
|
|
|
|
(void)(ff > ff2);
|
|
(void)(ff > fd2); // expected-error {{cannot convert}}
|
|
(void)(ff > ui2); // expected-error {{cannot convert}}
|
|
(void)(ui > ff2); // expected-error {{cannot convert}}
|
|
}
|