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