// 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}} }