blob: b3da72df25081420f73ba6483a920c9bf4db4fa2 [file] [log] [blame]
// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -fsyntax-only \
// RUN: -target-cpu future %s -verify
// RUN: %clang_cc1 -triple powerpc64-unknown-unknown -fsyntax-only \
// RUN: -target-cpu future %s -verify
// The use of PPC MMA types is strongly restricted. Non-pointer MMA variables
// can only be declared in functions and a limited number of operations are
// supported on these types. This test case checks that invalid uses of MMA
// types are correctly prevented.
// vector dmr
// typedef
typedef __dmr1024 dmr_t;
// function argument
void testDmrArg1(__dmr1024 vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmr;
}
void testDmrArg2(const __dmr1024 vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmr;
}
void testDmrArg3(const dmr_t vdmr, int *ptr) { // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
*vdmrp = vdmr;
}
// function return
__dmr1024 testDmrRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
return *vdmrp; // expected-error {{invalid use of PPC MMA type}}
}
const dmr_t testDmrRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
return *vdmrp; // expected-error {{invalid use of PPC MMA type}}
}
// global
__dmr1024 globalvdmr; // expected-error {{invalid use of PPC MMA type}}
const __dmr1024 globalvdmr2; // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *globalvdmrp;
const __dmr1024 *const globalvdmrp2;
dmr_t globalvdmr_t; // expected-error {{invalid use of PPC MMA type}}
// struct field
struct TestDmrStruct {
int a;
float b;
__dmr1024 c; // expected-error {{invalid use of PPC MMA type}}
__dmr1024 *vq;
};
// operators
int testDmrOperators1(int *ptr) {
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
__dmr1024 vdmr1 = *(vdmrp + 0);
__dmr1024 vdmr2 = *(vdmrp + 1);
__dmr1024 vdmr3 = *(vdmrp + 2);
if (vdmr1) // expected-error {{statement requires expression of scalar type ('__dmr1024' invalid)}}
*(vdmrp + 10) = vdmr1;
if (!vdmr2) // expected-error {{invalid argument type '__dmr1024' to unary expression}}
*(vdmrp + 11) = vdmr3;
int c1 = vdmr1 && vdmr2; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
int c2 = vdmr2 == vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
int c3 = vdmr2 < vdmr1; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
return c1 || c2 || c3;
}
void testDmrOperators2(int *ptr) {
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
__dmr1024 vdmr1 = *(vdmrp + 0);
__dmr1024 vdmr2 = *(vdmrp + 1);
__dmr1024 vdmr3 = *(vdmrp + 2);
vdmr1 = -vdmr1; // expected-error {{invalid argument type '__dmr1024' to unary expression}}
vdmr2 = vdmr1 + vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
vdmr2 = vdmr2 * vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
vdmr3 = vdmr3 | vdmr3; // expected-error {{invalid operands to binary expression ('__dmr1024' and '__dmr1024')}}
vdmr3 = vdmr3 << 2; // expected-error {{invalid operands to binary expression ('__dmr1024' and 'int')}}
*(vdmrp + 10) = vdmr1;
*(vdmrp + 11) = vdmr2;
*(vdmrp + 12) = vdmr3;
}
vector unsigned char testDmrOperators3(int *ptr) {
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
__dmr1024 vdmr1 = *(vdmrp + 0);
__dmr1024 vdmr2 = *(vdmrp + 1);
__dmr1024 vdmr3 = *(vdmrp + 2);
vdmr1 ? *(vdmrp + 10) = vdmr2 : *(vdmrp + 11) = vdmr3; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}
vdmr2 = vdmr3;
return vdmr2[1]; // expected-error {{subscripted value is not an array, pointer, or vector}}
}
void testDmrOperators4(int v, void *ptr) {
__dmr1024 *vdmrp = (__dmr1024 *)ptr;
__dmr1024 vdmr1 = (__dmr1024)v; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}
__dmr1024 vdmr2 = (__dmr1024)vdmrp; // expected-error {{used type '__dmr1024' where arithmetic or pointer type is required}}
}