197 lines · c
1// RUN: %clang_cc1 -triple=powerpc64-unknown-linux-gnu -target-feature +altivec -target-feature +vsx -fsyntax-only -verify=expected,nonaix %s2// RUN: %clang_cc1 -triple=powerpc64le-unknown-linux-gnu -target-feature +altivec -target-feature -vsx -fsyntax-only -verify=expected,novsx %s3// RUN: %clang_cc1 -triple=powerpc-ibm-aix -target-feature +altivec -fsyntax-only -verify=expected,aix %s4// fRUN: %clang_cc1 -triple=powerpc64-ibm-aix -target-feature +altivec -target-feature -vsx -fsyntax-only -verify=expected,aix %s5 6__vector char vv_c;7__vector signed char vv_sc;8__vector unsigned char vv_uc;9__vector short vv_s;10__vector signed short vv_ss;11__vector unsigned short vv_us;12__vector short int vv_si;13__vector signed short int vv_ssi;14__vector unsigned short int vv_usi;15__vector int vv_i;16__vector signed int vv_sint;17__vector unsigned int vv_ui;18__vector float vv_f;19__vector bool char vv_bc;20__vector bool short vv_bs;21__vector bool int vv_bi;22__vector __bool char vv___bc;23__vector __bool short vv___bs;24__vector __bool int vv___bi;25__vector __pixel vv_p;26__vector pixel vv__p;27__vector int vf__r(void);28void vf__a(__vector int a);29void vf__a2(int b, __vector int a);30 31vector char v_c;32vector signed char v_sc;33vector unsigned char v_uc;34vector short v_s;35vector signed short v_ss;36vector unsigned short v_us;37vector short int v_si;38vector signed short int v_ssi;39vector unsigned short int v_usi;40vector int v_i;41vector signed int v_sint;42vector unsigned int v_ui;43vector float v_f;44vector bool char v_bc;45vector bool short v_bs;46vector bool int v_bi;47vector __bool char v___bc;48vector __bool short v___bs;49vector __bool int v___bi;50vector __pixel v_p;51vector pixel v__p;52vector int f__r(void);53void f_a(vector int a);54void f_a2(int b, vector int a);55 56vector int v = (vector int)(-1);57 58// These should have errors on AIX and warnings otherwise.59__vector long vv_l; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}60 // aix-error@-1 {{cannot use 'long' with '__vector'}}61 // novsx-error@-2 {{cannot use 'long' with '__vector'}}62__vector signed long vv_sl; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}63 // aix-error@-1 {{cannot use 'long' with '__vector'}}64 // novsx-error@-2 {{cannot use 'long' with '__vector'}}65__vector unsigned long vv_ul; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}66 // aix-error@-1 {{cannot use 'long' with '__vector'}}67 // novsx-error@-2 {{cannot use 'long' with '__vector'}}68__vector long int vv_li; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}69 // aix-error@-1 {{cannot use 'long' with '__vector'}}70 // novsx-error@-2 {{cannot use 'long' with '__vector'}}71__vector signed long int vv_sli; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}72 // aix-error@-1 {{cannot use 'long' with '__vector'}}73 // novsx-error@-2 {{cannot use 'long' with '__vector'}}74__vector unsigned long int vv_uli; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}75 // aix-error@-1 {{cannot use 'long' with '__vector'}}76 // novsx-error@-2 {{cannot use 'long' with '__vector'}}77vector long v_l; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}78 // aix-error@-1 {{cannot use 'long' with '__vector'}}79 // novsx-error@-2 {{cannot use 'long' with '__vector'}}80vector signed long v_sl; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}81 // aix-error@-1 {{cannot use 'long' with '__vector'}}82 // novsx-error@-2 {{cannot use 'long' with '__vector'}}83vector unsigned long v_ul; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}84 // aix-error@-1 {{cannot use 'long' with '__vector'}}85 // novsx-error@-2 {{cannot use 'long' with '__vector'}}86vector long int v_li; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}87 // aix-error@-1 {{cannot use 'long' with '__vector'}}88 // novsx-error@-2 {{cannot use 'long' with '__vector'}}89vector signed long int v_sli; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}90 // aix-error@-1 {{cannot use 'long' with '__vector'}}91 // novsx-error@-2 {{cannot use 'long' with '__vector'}}92vector unsigned long int v_uli; // nonaix-warning {{use of 'long' with '__vector' is deprecated}}93 // aix-error@-1 {{cannot use 'long' with '__vector'}}94 // novsx-error@-2 {{cannot use 'long' with '__vector'}}95 96// These should have warnings.97__vector long double vv_ld; // expected-error {{cannot use 'long double' with '__vector'}}98vector long double v_ld; // expected-error {{cannot use 'long double' with '__vector'}}99vector bool v_b; // expected-error {{type specifier missing, defaults to 'int'}}100vector __bool v___b; // expected-error {{type specifier missing, defaults to 'int'}}101 102// These should have errors.103#ifndef __VSX__104__vector double vv_d1; // expected-error {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}105vector double v_d2; // expected-error {{use of 'double' with '__vector' requires VSX support to be enabled (available on POWER7 or later)}}106__vector bool long long v_bll1; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}107__vector __bool long long v_bll2; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}108vector bool long long v_bll3; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}109vector __bool long long v_bll4; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}110#endif111__vector long double vv_ld3; // expected-error {{cannot use 'long double' with '__vector'}}112vector long double v_ld4; // expected-error {{cannot use 'long double' with '__vector'}}113vector float _Complex v_cf; // expected-error {{cannot use '_Complex' with '__vector'}}114vector double _Complex v_cd; // expected-error {{cannot use '_Complex' with '__vector'}}115vector long double _Complex v_cld; // expected-error {{cannot use '_Complex' with '__vector'}}116__vector float _Complex v_cf2; // expected-error {{cannot use '_Complex' with '__vector'}}117__vector double _Complex v_cd2; // expected-error {{cannot use '_Complex' with '__vector'}}118__vector long double _Complex v_cld2;// expected-error {{cannot use '_Complex' with '__vector'}}119vector bool float v_bf; // expected-error {{cannot use 'float' with '__vector bool'}}120vector bool double v_bd; // expected-error {{cannot use 'double' with '__vector bool'}}121vector bool pixel v_bp; // expected-error {{cannot use '__pixel' with '__vector bool'}}122vector bool signed char v_bsc; // expected-error {{cannot use 'signed' with '__vector bool'}}123vector bool unsigned int v_bsc2; // expected-error {{cannot use 'unsigned' with '__vector bool'}}124vector bool long v_bl; // expected-error {{cannot use 'long' with '__vector bool'}}125vector __bool float v___bf; // expected-error {{cannot use 'float' with '__vector bool'}}126vector __bool double v___bd; // expected-error {{cannot use 'double' with '__vector bool'}}127vector __bool pixel v___bp; // expected-error {{cannot use '__pixel' with '__vector bool'}}128vector __bool signed char v___bsc; // expected-error {{cannot use 'signed' with '__vector bool'}}129vector __bool unsigned int v___bsc2; // expected-error {{cannot use 'unsigned' with '__vector bool'}}130vector __bool long v___bl; // expected-error {{cannot use 'long' with '__vector bool'}}131 132#ifdef __VSX__133// vector long is deprecated, but vector long long is not.134vector long long v_ll;135vector signed long long v_sll;136vector unsigned long long v_ull;137#else138// vector long long is not supported without vsx.139vector long long v_ll; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}140vector signed long long v_sll; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}141vector unsigned long long v_ull; // expected-error {{use of 'long long' with '__vector' requires VSX support (available on POWER7 or later) to be enabled}}142#endif143 144typedef char i8;145typedef short i16;146typedef int i32;147struct S {148 // i8, i16, i32 here are field names, not type names.149 vector bool i8; // expected-error {{requires a specifier or qualifier}}150 vector pixel i16;151 vector short i32;152};153 154void f(void) {155 __vector unsigned int v = {0,0,0,0};156 __vector int v__cast = (__vector int)v;157 __vector int v_cast = (vector int)v;158 __vector char vb_cast = (vector char)v;159 160 // Check some casting between gcc and altivec vectors.161 #define gccvector __attribute__((vector_size(16)))162 gccvector unsigned int gccv = {0,0,0,0};163 gccvector unsigned int gccv1 = gccv;164 gccvector int gccv2 = (gccvector int)gccv;165 gccvector unsigned int gccv3 = v;166 __vector unsigned int av = gccv;167 __vector int avi = (__vector int)gccv;168 gccvector unsigned int gv = v;169 gccvector int gvi = (gccvector int)v;170 __attribute__((vector_size(8))) unsigned int gv8;171 gv8 = gccv; // expected-error {{assigning to '__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' (vector of 2 'unsigned int' values) from incompatible type '__attribute__((__vector_size__(4 * sizeof(unsigned int)))) unsigned int' (vector of 4 'unsigned int' values)}}172 av = gv8; // expected-error {{assigning to '__vector unsigned int' (vector of 4 'unsigned int' values) from incompatible type '__attribute__((__vector_size__(2 * sizeof(unsigned int)))) unsigned int' (vector of 2 'unsigned int' values)}}173 174 v = gccv;175 __vector unsigned int tv = gccv;176 gccv = v;177 gccvector unsigned int tgv = v;178 179 int res_i;180 // bug 7553 - Problem with '==' and vectors181 res_i = (vv_sc == vv_sc);182 res_i = (vv_uc != vv_uc);183 res_i = (vv_s > vv_s);184 res_i = (vv_us >= vv_us);185 res_i = (vv_i < vv_i);186 res_i = (vv_ui <= vv_ui);187 res_i = (vv_f <= vv_f);188}189 190// bug 6895 - Vectorl literal casting confusion.191vector char v1 = (vector char)((vector int)(1, 2, 3, 4));192vector char v2 = (vector char)((vector float)(1.0f, 2.0f, 3.0f, 4.0f));193vector char v3 = (vector char)((vector int)('a', 'b', 'c', 'd'));194vector int v4 = (vector int)(1, 2, 3, 4);195vector float v5 = (vector float)(1.0f, 2.0f, 3.0f, 4.0f);196vector char v6 = (vector char)((vector int)(1+2, -2, (int)(2.0 * 3), -(5-3)));197