136 lines · cpp
1// RUN: %clang_cc1 -std=c++11 -fenable-matrix -fsyntax-only -verify %s2 3template <typename X>4 5using matrix_4_4 = X __attribute__((matrix_type(4, 4)));6 7template <typename Y>8 9using matrix_5_5 = Y __attribute__((matrix_type(5, 5)));10 11typedef struct test_struct {12} test_struct;13 14typedef int vec __attribute__((vector_size(4)));15 16void f1() {17 matrix_4_4<char> m1;18 matrix_4_4<int> m2;19 matrix_4_4<short> m3;20 matrix_5_5<int> m4;21 int i;22 vec v;23 test_struct *s;24 25 m2 = (matrix_4_4<int>)m1;26 m2 = m1; // expected-error {{assigning to 'matrix_4_4<int>' from incompatible type 'matrix_4_4<char>'}}27 m3 = (matrix_4_4<short>)m2;28 (matrix_5_5<int>)m3; // expected-error {{conversion between matrix types 'matrix_5_5<int>' (aka 'int __attribute__\29((matrix_type(5, 5)))') and 'short __attribute__((matrix_type(4, 4)))' of different size is not allowed}}30 31 (int)m3; // expected-error {{C-style cast from 'matrix_4_4<short>' (aka 'short __attribute__((matrix_type(4, 4)))') to 'int' is not allowed}}32 (matrix_4_4<int>)i; // expected-error {{C-style cast from 'int' to 'matrix_4_4<int>' (aka 'int __attribute__((matrix_type(4, 4)))') is not allowed}}33 34 (vec) m2; // expected-error {{C-style cast from 'matrix_4_4<int>' (aka 'int __attribute__((matrix_type(4, 4)))') to 'vec' (vector of 1 'int' value) is not allowed}}35 (matrix_4_4<char>)v; // expected-error {{C-style cast from 'vec' (vector of 1 'int' value) to 'matrix_4_4<char>' (aka 'char __attribute__((matrix_type(4, 4)))') is not allowed}}36 37 (test_struct *)m1; // expected-error {{cannot cast from type 'matrix_4_4<char>' (aka 'char __attribute__((matrix_type(4, 4)))') to pointer type 'test_struct *'}}38 (matrix_5_5<float>)s; // expected-error {{C-style cast from 'test_struct *' (aka 'struct test_struct *') to 'matrix_5_5<float>' (aka 'float __attribute__((matrix_type(5, 5)))') is not allowed}}39}40 41void f2() {42 matrix_4_4<char> m1;43 matrix_4_4<int> m2;44 matrix_4_4<short> m3;45 matrix_5_5<int> m4;46 int i;47 vec v;48 test_struct *s;49 50 m2 = static_cast<matrix_4_4<int>>(m1);51 m3 = static_cast<matrix_4_4<short>>(m2);52 static_cast<matrix_5_5<int>>(m3); // expected-error {{conversion between matrix types 'matrix_5_5<int>' (aka 'int __attribute__\53((matrix_type(5, 5)))') and 'short __attribute__((matrix_type(4, 4)))' of different size is not allowed}}54 55 static_cast<int>(m3); // expected-error {{static_cast from 'matrix_4_4<short>' (aka 'short __attribute__((matrix_type(4, 4)))') to 'int' is not allowed}}56 static_cast<matrix_4_4<int>>(i); // expected-error {{static_cast from 'int' to 'matrix_4_4<int>' (aka 'int __attribute__((matrix_type(4, 4)))') is not allowed}}57 58 static_cast<vec>(m2); // expected-error {{static_cast from 'matrix_4_4<int>' (aka 'int __attribute__((matrix_type(4, 4)))') to 'vec' (vector of 1 'int' value) is not allowed}}59 static_cast<matrix_4_4<char>>(v); // expected-error {{static_cast from 'vec' (vector of 1 'int' value) to 'matrix_4_4<char>' (aka 'char __attribute__((matrix_type(4, 4)))') is not allowed}}60 61 static_cast<test_struct *>(m1); // expected-error {{cannot cast from type 'matrix_4_4<char>' (aka 'char __attribute__((matrix_type(4, 4)))') to pointer type 'test_struct *'}}62 static_cast<matrix_5_5<float>>(s); // expected-error {{static_cast from 'test_struct *' (aka 'struct test_struct *') to 'matrix_5_5<float>' (aka 'float __attribute__((matrix_type(5, 5)))') is not allowed}}63}64 65void f3() {66 matrix_4_4<float> m1;67 matrix_4_4<double> m2;68 matrix_5_5<double> m3;69 matrix_5_5<signed int> m4;70 matrix_4_4<unsigned int> m5;71 matrix_5_5<unsigned int> m6;72 float f;73 74 m2 = (matrix_4_4<double>)m1;75 (matrix_5_5<double>)m1; // expected-error {{conversion between matrix types 'matrix_5_5<double>' (aka 'double __\76attribute__((matrix_type(5, 5)))') and 'float __attribute__((matrix_type(4, 4)))' of different\77 size is not allowed}}78 m4 = (matrix_5_5<signed int>)m3;79 m5 = (matrix_5_5<unsigned int>)m4; // expected-error {{assigning to 'matrix_4_4<unsigned int>' (aka 'unsigned int \80__attribute__((matrix_type(4, 4)))') from incompatible type 'matrix_5_5<unsigned int>' (aka 'unsigned int __attribute__\81((matrix_type(5, 5)))')}}82 m6 = (matrix_5_5<unsigned int>)m4;83 m4 = (matrix_5_5<signed int>)m6;84}85 86void f4() {87 matrix_4_4<float> m1;88 matrix_4_4<double> m2;89 matrix_5_5<double> m3;90 matrix_5_5<signed int> m4;91 matrix_4_4<unsigned int> m5;92 matrix_5_5<unsigned int> m6;93 float f;94 95 m2 = static_cast<matrix_4_4<double>>(m1);96 static_cast<matrix_5_5<double>>(m1); // expected-error {{conversion between matrix types 'matrix_5_5<double>' (aka 'double __\97attribute__((matrix_type(5, 5)))') and 'float __attribute__((matrix_type(4, 4)))' of different size is not allowed}}98 99 m4 = static_cast<matrix_5_5<signed int>>(m3);100 m5 = static_cast<matrix_5_5<unsigned int>>(m4); // expected-error {{assigning to 'matrix_4_4<unsigned int>' (aka 'unsigned int \101__attribute__((matrix_type(4, 4)))') from incompatible type 'matrix_5_5<unsigned int>' (aka 'unsigned int __attribute__\102((matrix_type(5, 5)))')}}103 m6 = static_cast<matrix_5_5<unsigned int>>(m4);104 m4 = static_cast<matrix_5_5<signed int>>(m6);105}106 107class Foo {108 // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'matrix_4_4<float>' (aka 'float __attribute__((matrix_type(4, 4)))') to 'const Foo' for 1st argument}}109 // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'matrix_4_4<float>' (aka 'float __attribute__((matrix_type(4, 4)))') to 'Foo' for 1st argument}}110 111 int x;112 113public:114 Foo();115 // expected-note@-1 {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}116 Foo(matrix_5_5<int> x);117 // expected-note@-1 {{candidate constructor not viable: no known conversion from 'matrix_4_4<float>' (aka 'float __attribute__((matrix_type(4, 4)))') to 'matrix_5_5<int>' (aka 'int __attribute__((matrix_type(5, 5)))') for 1st argument}}118};119 120struct Bar {121 // expected-note@-1 {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'matrix_4_4<unsigned int>' (aka 'unsigned int __attribute__((matrix_type(4, 4)))') to 'const Bar' for 1st argument}}122 // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'matrix_4_4<unsigned int>' (aka 'unsigned int __attribute__((matrix_type(4, 4)))') to 'Bar' for 1st argument}}123 // expected-note@-3 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}124 float x;125};126 127void f5_constructors() {128 matrix_4_4<float> m1;129 matrix_4_4<unsigned int> m5;130 131 Foo F = Foo(m1);132 // expected-error@-1 {{no matching conversion for functional-style cast from 'matrix_4_4<float>' (aka 'float __attribute__((matrix_type(4, 4)))') to 'Foo'}}133 Bar B = Bar(m5);134 // expected-error@-1 {{no matching conversion for functional-style cast from 'matrix_4_4<unsigned int>' (aka 'unsigned int __attribute__((matrix_type(4, 4)))') to 'Bar'}}135}136