1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// RUN: %clang_cc1 -fsyntax-only %s -verify -Wvector-conversion
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comtypedef long long t1 __attribute__ ((vector_size (8)));
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comtypedef char t2 __attribute__ ((vector_size (16)));
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.comtypedef float t3 __attribute__ ((vector_size (16)));
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
7971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.comvoid f()
857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com{
957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  t1 v1;
1057f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  t2 v2;
1157f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  t3 v3;
1257f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com
1357f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  v2 = (t2)v1; // expected-error {{invalid conversion between vector type \
1457f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com't2' (vector of 16 'char' values) and 't1' (vector of 1 'long long' value) of different size}}
1557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com  v1 = (t1)v2; // expected-error {{invalid conversion between vector type \
16b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com't1' (vector of 1 'long long' value) and 't2' (vector of 16 'char' values) of different size}}
176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com  v3 = (t3)v2;
1837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com
197bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com  v1 = (t1)(char *)10; // expected-error {{invalid conversion between vector \
2030e6e2af14e84216b1c113fd7500d0822bc81daamtkleintype 't1' (vector of 1 'long long' value) and scalar type 'char *'}}
21afb4379dbca4d4d3824ace183a7348d24bc1589fmtklein  v1 = (t1)(long long)10;
22bcbc1788b478b1e54079318ad073e8490aa66faetfarina  v1 = (t1)(short)10; // expected-error {{invalid conversion between vector \
23bcbc1788b478b1e54079318ad073e8490aa66faetfarinatype 't1' (vector of 1 'long long' value) and integer type 'short' of different size}}
245f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com
25b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com  long long r1 = (long long)v1;
26d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com  short r2 = (short)v1; // expected-error {{invalid conversion between vector \
278a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.comtype 't1' (vector of 1 'long long' value) and integer type 'short' of different size}}
284370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com  char *r3 = (char *)v1; // expected-error {{invalid conversion between vector\
29971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com type 't1' (vector of 1 'long long' value) and scalar type 'char *'}}
305e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org}
31de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com
32c41295d1223136da4f9e4c65b7145360684ede4bcommit-bot@chromium.org
335af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.comvoid f2(t2 X); // expected-note{{passing argument to parameter 'X' here}}
348015dd83ae37147bb630d4751030868051ad0caereed@android.com
358015dd83ae37147bb630d4751030868051ad0caereed@android.comvoid f3(t3 Y) {
368015dd83ae37147bb630d4751030868051ad0caereed@android.com  f2(Y);  // expected-warning {{incompatible vector types passing 't3' (vector of 4 'float' values) to parameter of type 't2' (vector of 16 'char' values)}}
37e3bb3bce3e9c1f3bc8ee779b1b3383c18e560bcecommit-bot@chromium.org}
38e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com
390dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgtypedef float float2 __attribute__ ((vector_size (8)));
409875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com
41770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.comvoid f4() {
42977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com  float2 f2;
435e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org  double d;
4472c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com  f2 += d;
45f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com  d += f2;
4611db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com}
472a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.com
48310478e72c63e639373465216271b81f1e4a9136epoger@google.com// rdar://15931426
490770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com// Don't permit a lax conversion to and from a pointer type.
50515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgtypedef short short_sizeof_pointer __attribute__((vector_size(sizeof(void*))));
51515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgvoid f5() {
528065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org  short_sizeof_pointer v;
53515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org  void *ptr;
54515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org  v = ptr; // expected-error-re {{assigning to 'short_sizeof_pointer' (vector of {{[0-9]+}} 'short' values) from incompatible type 'void *'}}
55515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org  ptr = v; // expected-error {{assigning to 'void *' from incompatible type 'short_sizeof_pointer'}}
56515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org}
57ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com