190 lines · c
1// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -fsyntax-only \2// RUN: -target-cpu future %s -verify3// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -fsyntax-only \4// RUN: -target-cpu future %s -verify5 6// The use of PPC MMA types is strongly restricted. Non-pointer MMA variables7// can only be declared in functions and a limited number of operations are8// supported on these types. This test case checks that invalid uses of MMA9// types are correctly prevented.10 11// vector dmr12 13// typedef14typedef __dmr1024 dmr_t;15typedef __dmr2048 dmrp_t;16 17// function argument18void testDmrArg1(dmr_t vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}19 dmr_t *vdmrp = (dmr_t *)ptr;20 *vdmrp = vdmr;21}22 23void testDmrArg2(const dmr_t vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}24 dmr_t *vdmrp = (dmr_t *)ptr;25 *vdmrp = vdmr;26}27 28void testDmrArg3(const dmr_t vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}29 dmr_t *vdmrp = (dmr_t *)ptr;30 *vdmrp = vdmr;31}32 33void testDmrPArg1(const dmrp_t vdmrp, int *ptr) { // expected-error {{invalid use of PPC MMA type}}34 dmrp_t *vdmrpp = (dmrp_t *)ptr;35 *vdmrpp = vdmrp;36}37 38void testDmrPArg2(const dmrp_t vdmrp, int *ptr) { // expected-error {{invalid use of PPC MMA type}}39 dmrp_t *vdmrpp = (dmrp_t *)ptr;40 *vdmrpp = vdmrp;41}42 43void testDmrPArg3(const dmrp_t vdmrp, int *ptr) { // expected-error {{invalid use of PPC MMA type}}44 dmrp_t *vdmrpp = (dmrp_t *)ptr;45 *vdmrpp = vdmrp;46}47 48// function return49dmr_t testDmrRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}}50 dmr_t *vdmrp = (dmr_t *)ptr;51 return *vdmrp; // expected-error {{invalid use of PPC MMA type}}52}53 54const dmr_t testDmrRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}}55 dmr_t *vdmrp = (dmr_t *)ptr;56 return *vdmrp; // expected-error {{invalid use of PPC MMA type}}57}58 59dmrp_t testDmrPRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}}60 dmrp_t *vdmrpp = (dmrp_t *)ptr;61 return *vdmrpp; // expected-error {{invalid use of PPC MMA type}}62}63 64const dmrp_t testDmrPRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}}65 dmrp_t *vdmrpp = (dmrp_t *)ptr;66 return *vdmrpp; // expected-error {{invalid use of PPC MMA type}}67}68 69// global70dmr_t globalvdmr; // expected-error {{invalid use of PPC MMA type}}71const dmr_t globalvdmr2; // expected-error {{invalid use of PPC MMA type}}72dmr_t *globalvdmrp;73const dmr_t *const globalvdmrp2;74dmr_t globalvdmr_t; // expected-error {{invalid use of PPC MMA type}}75 76dmrp_t globalvdmrp; // expected-error {{invalid use of PPC MMA type}}77const dmrp_t globalvdmrp2; // expected-error {{invalid use of PPC MMA type}}78dmrp_t *globalvdmrpp;79const dmrp_t *const globalvdmrpp2;80dmrp_t globalvdmrp_t; // expected-error {{invalid use of PPC MMA type}}81 82// struct field83struct TestDmrStruct {84 int a;85 float b;86 dmr_t c; // expected-error {{invalid use of PPC MMA type}}87 dmr_t *vq;88};89 90struct TestDmrPStruct {91 int a;92 float b;93 dmrp_t c; // expected-error {{invalid use of PPC MMA type}}94 dmrp_t *vq;95};96 97// operators98int testDmrOperators1(int *ptr) {99 __dmr1024 *vdmrp = (__dmr1024 *)ptr;100 __dmr1024 vdmr1 = *(vdmrp + 0);101 __dmr1024 vdmr2 = *(vdmrp + 1);102 __dmr1024 vdmr3 = *(vdmrp + 2);103 if (vdmr1) // expected-error {{statement requires expression of scalar type ('__dmr1024' invalid)}}104 *(vdmrp + 10) = vdmr1;105 if (!vdmr2) // expected-error {{invalid argument type '__dmr1024' to unary expression}}106 *(vdmrp + 11) = vdmr3;107 int c1 = vdmr1 && vdmr2; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}108 int c2 = vdmr2 == vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}109 int c3 = vdmr2 < vdmr1; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}110 return c1 || c2 || c3;111}112 113void testDmrOperators2(int *ptr) {114 __dmr1024 *vdmrp = (__dmr1024 *)ptr;115 __dmr1024 vdmr1 = *(vdmrp + 0);116 __dmr1024 vdmr2 = *(vdmrp + 1);117 __dmr1024 vdmr3 = *(vdmrp + 2);118 vdmr1 = -vdmr1; // expected-error {{invalid argument type '__dmr1024' to unary expression}}119 vdmr2 = vdmr1 + vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}120 vdmr2 = vdmr2 * vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}121 vdmr3 = vdmr3 | vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}122 vdmr3 = vdmr3 << 2; // expected-error {{invalid operands to binary expression ('__dmr1024' and 'int')}}123 *(vdmrp + 10) = vdmr1;124 *(vdmrp + 11) = vdmr2;125 *(vdmrp + 12) = vdmr3;126}127 128vector unsigned char testDmrOperators3(int *ptr) {129 __dmr1024 *vdmrp = (__dmr1024 *)ptr;130 __dmr1024 vdmr1 = *(vdmrp + 0);131 __dmr1024 vdmr2 = *(vdmrp + 1);132 __dmr1024 vdmr3 = *(vdmrp + 2);133 vdmr1 ? *(vdmrp + 10) = vdmr2 : *(vdmrp + 11) = vdmr3; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}134 vdmr2 = vdmr3;135 return vdmr2[1]; // expected-error {{subscripted value is not an array, pointer, or vector}}136}137 138void testDmrOperators4(int v, void *ptr) {139 __dmr1024 *vdmrp = (__dmr1024 *)ptr;140 __dmr1024 vdmr1 = (__dmr1024)v; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}141 __dmr1024 vdmr2 = (__dmr1024)vdmrp; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}142}143 144int testDmrPOperators1(int *ptr) {145 __dmr2048 *vdmrpp = (__dmr2048 *)ptr;146 __dmr2048 vdmrp1 = *(vdmrpp + 0);147 __dmr2048 vdmrp2 = *(vdmrpp + 1);148 __dmr2048 vdmrp3 = *(vdmrpp + 2);149 if (vdmrp1) // expected-error {{statement requires expression of scalar type ('__dmr2048' invalid)}}150 *(vdmrpp + 10) = vdmrp1;151 if (!vdmrp2) // expected-error {{invalid argument type '__dmr2048' to unary expression}}152 *(vdmrpp + 11) = vdmrp3;153 int c1 = vdmrp1 && vdmrp2; // expected-error {{invalid operands to binary expression ('__dmr2048' and '__dmr2048')}}154 int c2 = vdmrp2 == vdmrp3; // expected-error {{invalid operands to binary expression ('__dmr2048' and '__dmr2048')}}155 int c3 = vdmrp2 < vdmrp1; // expected-error {{invalid operands to binary expression ('__dmr2048' and '__dmr2048')}}156 return c1 || c2 || c3;157}158 159void testDmrPOperators2(int *ptr) {160 __dmr2048 *vdmrpp = (__dmr2048 *)ptr;161 __dmr2048 vdmrp1 = *(vdmrpp + 0);162 __dmr2048 vdmrp2 = *(vdmrpp + 1);163 __dmr2048 vdmrp3 = *(vdmrpp + 2);164 vdmrp1 = -vdmrp1; // expected-error {{invalid argument type '__dmr2048' to unary expression}}165 vdmrp2 = vdmrp1 + vdmrp3; // expected-error {{invalid operands to binary expression ('__dmr2048' and '__dmr2048')}}166 vdmrp2 = vdmrp2 * vdmrp3; // expected-error {{invalid operands to binary expression ('__dmr2048' and '__dmr2048')}}167 vdmrp3 = vdmrp3 | vdmrp3; // expected-error {{invalid operands to binary expression ('__dmr2048' and '__dmr2048')}}168 vdmrp3 = vdmrp3 << 2; // expected-error {{invalid operands to binary expression ('__dmr2048' and 'int')}}169 *(vdmrpp + 10) = vdmrp1;170 *(vdmrpp + 11) = vdmrp2;171 *(vdmrpp + 12) = vdmrp3;172}173 174 175vector unsigned char testDmrPOperators3(int *ptr) {176 __dmr2048 *vdmrpp = (__dmr2048 *)ptr;177 __dmr2048 vdmrp1 = *(vdmrpp + 0);178 __dmr2048 vdmrp2 = *(vdmrpp + 1);179 __dmr2048 vdmrp3 = *(vdmrpp + 2);180 vdmrp1 ? *(vdmrpp + 10) = vdmrp2 : *(vdmrpp + 11) = vdmrp3; // expected-error {{used type '__dmr2048' where arithmetic or pointer type is required}}181 vdmrp2 = vdmrp3;182 return vdmrp2[1]; // expected-error {{subscripted value is not an array, pointer, or vector}}183}184 185void testDmrPOperators4(int v, void *ptr) {186 __dmr2048 *vdmrpp = (__dmr2048 *)ptr;187 __dmr2048 vdmrp1 = (__dmr2048)v; // expected-error {{used type '__dmr2048' where arithmetic or pointer type is required}}188 __dmr2048 vdmrp2 = (__dmr2048)vdmrpp; // expected-error {{used type '__dmr2048' where arithmetic or pointer type is required}}189}190