// RUN: %clang_cc1 -triple powerpc64le-unknown-unknown -fsyntax-only \ // RUN: -fcxx-exceptions -target-cpu future %s -verify // vector quad // alias using vq_t = __vector_quad; void testVQAlias(int *inp, int *outp) { vq_t *vqin = (vq_t *)inp; vq_t *vqout = (vq_t *)outp; *vqout = *vqin; } class TestClassVQ { // method argument public: void testVQArg1(__vector_quad vq, int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_quad *vqp = (__vector_quad *)ptr; *vqp = vq; *vqp1 = vq; } void testVQArg2(const __vector_quad vq, int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_quad *vqp = (__vector_quad *)ptr; *vqp = vq; *vqp2 = vq; } void testVQArg3(__vector_quad *vq, int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; *vqp = *vq; vqp1 = vqp; } void testVQArg4(const __vector_quad *const vq, int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; *vqp = *vq; vqp2 = vqp; } void testVQArg5(__vector_quad vqa[], int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; *vqp = vqa[0]; *vqp1 = vqa[1]; } void testVQArg6(const vq_t vq, int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_quad *vqp = (__vector_quad *)ptr; *vqp = vq; *vqp2 = vq; } void testVQArg7(const vq_t *vq, int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; *vqp = *vq; vqp1 = vqp; } // method return __vector_quad testVQRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_quad *vqp = (__vector_quad *)ptr; vq1 = *vqp; return *vqp; // expected-error {{invalid use of PPC MMA type}} } __vector_quad *testVQRet2(int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; vq2 = *vqp; return vqp + 2; } const __vector_quad *testVQRet3(int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; vqp1 = vqp; return vqp + 2; } const vq_t testVQRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_quad *vqp = (__vector_quad *)ptr; vqp2 = vqp; return *vqp; // expected-error {{invalid use of PPC MMA type}} } const vq_t *testVQRet5(int *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; vq1 = *vqp; return vqp + 2; } // template argument template void testVQTemplate(T v, T *p) { // expected-note {{candidate template ignored: substitution failure [with T = __vector_quad]: invalid use of PPC MMA type}} \ expected-note {{candidate template ignored: substitution failure [with T = __vector_quad]: invalid use of PPC MMA type}} *(p + 1) = v; } // class field public: __vector_quad vq1; // expected-error {{invalid use of PPC MMA type}} __vector_quad *vqp1; private: vq_t vq2; // expected-error {{invalid use of PPC MMA type}} vq_t *vqp2; }; // template template class ClassTemplateVQ1 { T t; // expected-error {{invalid use of PPC MMA type}} }; template class ClassTemplateVQ2 { T *t; }; template class ClassTemplateVQ3 { int foo(T t) { return 10; } }; template class ClassTemplateVQ4 { public: T operator()(Ts...) const {} // expected-error {{invalid use of PPC MMA type}} }; void testVQTemplate() { ClassTemplateVQ1<__vector_quad> t1; // expected-note {{in instantiation of template class 'ClassTemplateVQ1<__vector_quad>' requested here}} ClassTemplateVQ1<__vector_quad *> t2; ClassTemplateVQ2<__vector_quad> t3; ClassTemplateVQ2<__vector_quad *> t4; ClassTemplateVQ3 t5; // The following case is not prevented but it ok, this function type cannot be // instantiated because we prevent any function from returning an MMA type. ClassTemplateVQ3<__vector_quad(int, int, int)> t6; ClassTemplateVQ3 t7; // expected-error {{invalid use of PPC MMA type}} ClassTemplateVQ4 t8; // expected-note {{in instantiation of template class 'ClassTemplateVQ4' requested here}} ClassTemplateVQ4 t9; TestClassVQ tc; __vector_quad vq; __vector_quad *vqp = &vq; tc.testVQTemplate(&vq, &vqp); tc.testVQTemplate(&vq, &vqp); tc.testVQTemplate(vq, vqp); // expected-error {{no matching member function for call to 'testVQTemplate'}} tc.testVQTemplate(vq, vqp); // expected-error {{no matching member function for call to 'testVQTemplate'}} } // trailing return type auto testVQTrailing1() { __vector_quad vq; return vq; // expected-error {{invalid use of PPC MMA type}} } auto testVQTrailing2() { __vector_quad *vqp; return vqp; } auto testVQTrailing3() -> vq_t { // expected-error {{invalid use of PPC MMA type}} __vector_quad vq; return vq; // expected-error {{invalid use of PPC MMA type}} } auto testVQTrailing4() -> vq_t * { __vector_quad *vqp; return vqp; } // new/delete void testVQNewDelete() { __vector_quad *vqp1 = new __vector_quad; __vector_quad *vqp2 = new __vector_quad[100]; delete vqp1; delete[] vqp2; } // lambdas expressions void TestVQLambda() { auto f1 = [](void *ptr) -> __vector_quad { __vector_quad *vqp = (__vector_quad *)ptr; return *vqp; // expected-error {{invalid use of PPC MMA type}} }; auto f2 = [](void *ptr) { __vector_quad *vqp = (__vector_quad *)ptr; return *vqp; // expected-error {{invalid use of PPC MMA type}} }; auto f3 = [] { __vector_quad vq; __builtin_mma_xxsetaccz(&vq); return vq; }; // expected-error {{invalid use of PPC MMA type}} } // cast void TestVQCast() { __vector_quad vq; int *ip = reinterpret_cast(&vq); __vector_quad *vq2 = reinterpret_cast<__vector_quad *>(ip); } // throw void TestVQThrow() { __vector_quad vq; throw vq; // expected-error {{invalid use of PPC MMA type}} } // vector pair // alias using vp_t = __vector_pair; void testVPAlias(int *inp, int *outp) { vp_t *vpin = (vp_t *)inp; vp_t *vpout = (vp_t *)outp; *vpout = *vpin; } class TestClassVP { // method argument public: void testVPArg1(__vector_pair vp, int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_pair *vpp = (__vector_pair *)ptr; *vpp = vp; *vpp1 = vp; } void testVPArg2(const __vector_pair vp, int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_pair *vpp = (__vector_pair *)ptr; *vpp = vp; *vpp2 = vp; } void testVPArg3(__vector_pair *vp, int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; *vpp = *vp; vpp1 = vpp; } void testVPArg4(const __vector_pair *const vp, int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; *vpp = *vp; vpp2 = vpp; } void testVPArg5(__vector_pair vpa[], int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; *vpp = vpa[0]; *vpp1 = vpa[1]; } void testVPArg6(const vp_t vp, int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_pair *vpp = (__vector_pair *)ptr; *vpp = vp; *vpp2 = vp; } void testVPArg7(const vp_t *vp, int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; *vpp = *vp; vpp1 = vpp; } // method return __vector_pair testVPRet1(int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_pair *vpp = (__vector_pair *)ptr; vp1 = *vpp; return *vpp; // expected-error {{invalid use of PPC MMA type}} } __vector_pair *testVPRet2(int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; vp2 = *vpp; return vpp + 2; } const __vector_pair *testVPRet3(int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; vpp1 = vpp; return vpp + 2; } const vp_t testVPRet4(int *ptr) { // expected-error {{invalid use of PPC MMA type}} __vector_pair *vpp = (__vector_pair *)ptr; vpp2 = vpp; return *vpp; // expected-error {{invalid use of PPC MMA type}} } const vp_t *testVPRet5(int *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; vp1 = *vpp; return vpp + 2; } // template argument template void testVPTemplate(T v, T *p) { // expected-note {{candidate template ignored: substitution failure [with T = __vector_pair]: invalid use of PPC MMA type}} \ expected-note {{candidate template ignored: substitution failure [with T = __vector_pair]: invalid use of PPC MMA type}} *(p + 1) = v; } // class field public: __vector_pair vp1; // expected-error {{invalid use of PPC MMA type}} __vector_pair *vpp1; private: vp_t vp2; // expected-error {{invalid use of PPC MMA type}} vp_t *vpp2; }; // template template class ClassTemplateVP1 { T t; // expected-error {{invalid use of PPC MMA type}} }; template class ClassTemplateVP2 { T *t; }; template class ClassTemplateVP3 { int foo(T t) { return 10; } }; template class ClassTemplateVP4 { public: T operator()(Ts...) const {} // expected-error {{invalid use of PPC MMA type}} }; void testVPTemplate() { ClassTemplateVP1<__vector_pair> t1; // expected-note {{in instantiation of template class 'ClassTemplateVP1<__vector_pair>' requested here}} ClassTemplateVP1<__vector_pair *> t2; ClassTemplateVP2<__vector_pair> t3; ClassTemplateVP2<__vector_pair *> t4; ClassTemplateVP3 t5; // The following case is not prevented but it ok, this function type cannot be // instantiated because we prevent any function from returning an MMA type. ClassTemplateVP3<__vector_pair(int, int, int)> t6; ClassTemplateVP3 t7; // expected-error {{invalid use of PPC MMA type}} ClassTemplateVP4 t8; // expected-note {{in instantiation of template class 'ClassTemplateVP4' requested here}} ClassTemplateVP4 t9; TestClassVP tc; __vector_pair vp; __vector_pair *vpp = &vp; tc.testVPTemplate(&vp, &vpp); tc.testVPTemplate(&vp, &vpp); tc.testVPTemplate(vp, vpp); // expected-error {{no matching member function for call to 'testVPTemplate'}} tc.testVPTemplate(vp, vpp); // expected-error {{no matching member function for call to 'testVPTemplate'}} } // trailing return type auto testVPTrailing1() { __vector_pair vp; return vp; // expected-error {{invalid use of PPC MMA type}} } auto testVPTrailing2() { __vector_pair *vpp; return vpp; } auto testVPTrailing3() -> vp_t { // expected-error {{invalid use of PPC MMA type}} __vector_pair vp; return vp; // expected-error {{invalid use of PPC MMA type}} } auto testVPTrailing4() -> vp_t * { __vector_pair *vpp; return vpp; } // new/delete void testVPNewDelete() { __vector_pair *vpp1 = new __vector_pair; __vector_pair *vpp2 = new __vector_pair[100]; delete vpp1; delete[] vpp2; } // lambdas expressions void TestVPLambda() { auto f1 = [](void *ptr) -> __vector_pair { __vector_pair *vpp = (__vector_pair *)ptr; return *vpp; // expected-error {{invalid use of PPC MMA type}} }; auto f2 = [](void *ptr) { __vector_pair *vpp = (__vector_pair *)ptr; return *vpp; // expected-error {{invalid use of PPC MMA type}} }; auto f3 = [](vector unsigned char vc) { __vector_pair vp; __builtin_vsx_assemble_pair(&vp, vc, vc); return vp; }; // expected-error {{invalid use of PPC MMA type}} } // cast void TestVPCast() { __vector_pair vp; int *ip = reinterpret_cast(&vp); __vector_pair *vp2 = reinterpret_cast<__vector_pair *>(ip); } // throw void TestVPThrow() { __vector_pair vp; throw vp; // expected-error {{invalid use of PPC MMA type}} }