[clang] ecb235d - [Matrix] Implement static cast for matrix types

Saurabh Jha via cfe-commits cfe-commits at lists.llvm.org
Sun May 16 00:09:20 PDT 2021


Author: Saurabh Jha
Date: 2021-05-16T08:09:12+01:00
New Revision: ecb235d94014903ec60e1539e6f0105ea6a4b089

URL: https://github.com/llvm/llvm-project/commit/ecb235d94014903ec60e1539e6f0105ea6a4b089
DIFF: https://github.com/llvm/llvm-project/commit/ecb235d94014903ec60e1539e6f0105ea6a4b089.diff

LOG: [Matrix] Implement static cast for matrix types

This patch implements static casts for matrix types. This patch finishes all the work needed for https://bugs.llvm.org/show_bug.cgi?id=47141

Reviewed By: fhahn

Differential Revision: https://reviews.llvm.org/D102125

Added: 
    

Modified: 
    clang/lib/Sema/SemaCast.cpp
    clang/test/CodeGenCXX/matrix-casts.cpp
    clang/test/SemaCXX/matrix-casts.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp
index 8a9ee1a309941..7ed62cc8990eb 100644
--- a/clang/lib/Sema/SemaCast.cpp
+++ b/clang/lib/Sema/SemaCast.cpp
@@ -1179,6 +1179,13 @@ void CastOperation::CheckStaticCast() {
       return;
   }
 
+  if (DestType->getAs<MatrixType>() ||
+      SrcExpr.get()->getType()->getAs<MatrixType>()) {
+    if (Self.CheckMatrixCast(OpRange, DestType, SrcExpr.get()->getType(), Kind))
+      SrcExpr = ExprError();
+    return;
+  }
+
   // This test is outside everything else because it's the only case where
   // a non-lvalue-reference target type does not lead to decay.
   // C++ 5.2.9p4: Any expression can be explicitly converted to type "cv void".

diff  --git a/clang/test/CodeGenCXX/matrix-casts.cpp b/clang/test/CodeGenCXX/matrix-casts.cpp
index 26fd77fd26f60..fea585bb0ba29 100644
--- a/clang/test/CodeGenCXX/matrix-casts.cpp
+++ b/clang/test/CodeGenCXX/matrix-casts.cpp
@@ -6,8 +6,8 @@ using matrix_4_4 = X __attribute__((matrix_type(4, 4)));
 template <typename Y>
 using matrix_5_5 = Y __attribute__((matrix_type(5, 5)));
 
-// CHECK-LABEL: define{{.*}} void @_Z19CastCharMatrixToIntv
-void CastCharMatrixToInt() {
+// CHECK-LABEL: define{{.*}} void @_Z25CastCharMatrixToIntCStylev()
+void CastCharMatrixToIntCStyle() {
   // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
   // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
   // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
@@ -18,8 +18,20 @@ void CastCharMatrixToInt() {
   i = (matrix_5_5<int>)c;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z27CastCharMatrixToUnsignedIntv
-void CastCharMatrixToUnsignedInt() {
+// CHECK-LABEL: define{{.*}} void @_Z29CastCharMatrixToIntStaticCastv()
+void CastCharMatrixToIntStaticCast() {
+  // CHECK: [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
+  // CHECK-NEXT: [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
+  // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
+  // CHECK-NEXT: store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+
+  matrix_5_5<char> c;
+  matrix_5_5<int> i;
+  i = static_cast<matrix_5_5<int>>(c);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z33CastCharMatrixToUnsignedIntCStylev
+void CastCharMatrixToUnsignedIntCStyle() {
   // CHECK:       [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
@@ -31,8 +43,21 @@ void CastCharMatrixToUnsignedInt() {
   u = (matrix_5_5<unsigned int>)c;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z32CastUnsignedLongIntMatrixToShortv
-void CastUnsignedLongIntMatrixToShort() {
+// CHECK-LABEL: define{{.*}} void @_Z37CastCharMatrixToUnsignedIntStaticCastv
+void CastCharMatrixToUnsignedIntStaticCast() {
+  // CHECK:       [[C:%.*]] = load <25 x i8>, <25 x i8>* {{.*}}, align 1
+  // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i8> [[C]] to <25 x i32>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<char> c;
+  matrix_5_5<unsigned int> u;
+  u = static_cast<matrix_5_5<unsigned int>>(c);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedLongIntMatrixToShortCStylev
+void CastUnsignedLongIntMatrixToShortCStyle() {
   // CHECK:      [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
   // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
   // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
@@ -44,8 +69,21 @@ void CastUnsignedLongIntMatrixToShort() {
   s = (matrix_5_5<short int>)u;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z20CastIntMatrixToShortv()
-void CastIntMatrixToShort() {
+// CHECK-LABEL: define{{.*}} void @_Z42CastUnsignedLongIntMatrixToShortStaticCastv
+void CastUnsignedLongIntMatrixToShortStaticCast() {
+  // CHECK:      [[U:%.*]] = load <25 x i64>, <25 x i64>* {{.*}}, align 8
+  // CHECK-NEXT: [[CONV:%.*]] = trunc <25 x i64> {{.*}} to <25 x i16>
+  // CHECK-NEXT: [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
+  // CHECK-NEXT: store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT: ret void
+
+  matrix_5_5<unsigned long int> u;
+  matrix_5_5<short int> s;
+  s = static_cast<matrix_5_5<short int>>(u);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToShortCStylev()
+void CastIntMatrixToShortCStyle() {
   // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
@@ -57,8 +95,21 @@ void CastIntMatrixToShort() {
   s = (matrix_5_5<short int>)i;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z20CastIntMatrixToFloatv()
-void CastIntMatrixToFloat() {
+// CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToShortStaticCastv()
+void CastIntMatrixToShortStaticCast() {
+  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i32> [[I]] to <25 x i16>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<int> i;
+  matrix_5_5<short int> s;
+  s = static_cast<matrix_5_5<short int>>(i);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z26CastIntMatrixToFloatCStylev()
+void CastIntMatrixToFloatCStyle() {
   // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
   // CHECK-NEXT:  [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
   // CHECK-NEXT:  [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
@@ -70,8 +121,21 @@ void CastIntMatrixToFloat() {
   f = (matrix_5_5<float>)i;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z28CastUnsignedIntMatrixToFloatv()
-void CastUnsignedIntMatrixToFloat() {
+// CHECK-LABEL: define{{.*}} void @_Z30CastIntMatrixToFloatStaticCastv()
+void CastIntMatrixToFloatStaticCast() {
+  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  [[CONV]] = sitofp <25 x i32> {{.*}} to <25 x float>
+  // CHECK-NEXT:  [[CONV1]] = bitcast [25 x float]* {{.*}} to <25 x float>*
+  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<int> i;
+  matrix_5_5<float> f;
+  f = static_cast<matrix_5_5<float>>(i);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z34CastUnsignedIntMatrixToFloatCStylev()
+void CastUnsignedIntMatrixToFloatCStyle() {
   // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
@@ -83,8 +147,21 @@ void CastUnsignedIntMatrixToFloat() {
   f = (matrix_5_5<float>)u;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z21CastDoubleMatrixToIntv()
-void CastDoubleMatrixToInt() {
+// CHECK-LABEL: define{{.*}} void @_Z38CastUnsignedIntMatrixToFloatStaticCastv()
+void CastUnsignedIntMatrixToFloatStaticCast() {
+  // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+  // CHECK-NEXT:  [[CONV:%.*]] = uitofp <25 x i16> [[U]] to <25 x float>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
+  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* {{.*}}, align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<unsigned short int> u;
+  matrix_5_5<float> f;
+  f = static_cast<matrix_5_5<float>>(u);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z27CastDoubleMatrixToIntCStylev()
+void CastDoubleMatrixToIntCStyle() {
   // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
@@ -96,8 +173,21 @@ void CastDoubleMatrixToInt() {
   i = (matrix_5_5<int>)d;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z33CastFloatMatrixToUnsignedShortIntv()
-void CastFloatMatrixToUnsignedShortInt() {
+// CHECK-LABEL: define{{.*}} void @_Z31CastDoubleMatrixToIntStaticCastv()
+void CastDoubleMatrixToIntStaticCast() {
+  // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
+  // CHECK-NEXT:  [[CONV:%.*]] = fptosi <25 x double> [[D]] to <25 x i32>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* %i to <25 x i32>*
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<double> d;
+  matrix_5_5<int> i;
+  i = static_cast<matrix_5_5<int>>(d);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z39CastFloatMatrixToUnsignedShortIntCStylev()
+void CastFloatMatrixToUnsignedShortIntCStyle() {
   // CHECK:       [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
@@ -109,8 +199,21 @@ void CastFloatMatrixToUnsignedShortInt() {
   i = (matrix_5_5<unsigned short int>)f;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z23CastDoubleMatrixToFloatv()
-void CastDoubleMatrixToFloat() {
+// CHECK-LABEL: define{{.*}} void @_Z43CastFloatMatrixToUnsignedShortIntStaticCastv()
+void CastFloatMatrixToUnsignedShortIntStaticCast() {
+  // CHECK:       [[F:%.*]] = load <25 x float>, <25 x float>* {{.*}}, align 4
+  // CHECK-NEXT:  [[CONV:%.*]] = fptoui <25 x float> [[F]] to <25 x i16>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<float> f;
+  matrix_5_5<unsigned short int> i;
+  i = static_cast<matrix_5_5<unsigned short int>>(f);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z29CastDoubleMatrixToFloatCStylev()
+void CastDoubleMatrixToFloatCStyle() {
   // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
@@ -122,8 +225,21 @@ void CastDoubleMatrixToFloat() {
   f = (matrix_5_5<float>)d;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z33CastUnsignedShortIntToUnsignedIntv()
-void CastUnsignedShortIntToUnsignedInt() {
+// CHECK-LABEL: define{{.*}} void @_Z33CastDoubleMatrixToFloatStaticCastv()
+void CastDoubleMatrixToFloatStaticCast() {
+  // CHECK:       [[D:%.*]] = load <25 x double>, <25 x double>* {{.*}}, align 8
+  // CHECK-NEXT:  [[CONV:%.*]] = fptrunc <25 x double> [[D]] to <25 x float>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x float]* {{.*}} to <25 x float>*
+  // CHECK-NEXT:  store <25 x float> [[CONV]], <25 x float>* [[CONV1]], align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<double> d;
+  matrix_5_5<float> f;
+  f = static_cast<matrix_5_5<float>>(d);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z39CastUnsignedShortIntToUnsignedIntCStylev()
+void CastUnsignedShortIntToUnsignedIntCStyle() {
   // CHECK:       [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
@@ -135,8 +251,21 @@ void CastUnsignedShortIntToUnsignedInt() {
   i = (matrix_5_5<unsigned int>)s;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z37CastUnsignedLongIntToUnsignedShortIntv()
-void CastUnsignedLongIntToUnsignedShortInt() {
+// CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedShortIntToUnsignedIntStaticCastv()
+void CastUnsignedShortIntToUnsignedIntStaticCast() {
+  // CHECK:       [[S:%.*]] = load <25 x i16>, <25 x i16>* {{.*}}, align 2
+  // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[S]] to <25 x i32>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* [[CONV1]], align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<unsigned short int> s;
+  matrix_5_5<unsigned int> i;
+  i = static_cast<matrix_5_5<unsigned int>>(s);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z43CastUnsignedLongIntToUnsignedShortIntCStylev()
+void CastUnsignedLongIntToUnsignedShortIntCStyle() {
   // CHECK:       [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
   // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
@@ -148,8 +277,21 @@ void CastUnsignedLongIntToUnsignedShortInt() {
   s = (matrix_5_5<unsigned short int>)l;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z25CastUnsignedShortIntToIntv()
-void CastUnsignedShortIntToInt() {
+// CHECK-LABEL: define{{.*}} void @_Z47CastUnsignedLongIntToUnsignedShortIntStaticCastv()
+void CastUnsignedLongIntToUnsignedShortIntStaticCast() {
+  // CHECK:       [[L:%.*]] = load <25 x i64>, <25 x i64>* %0, align 8
+  // CHECK-NEXT:  [[CONV:%.*]] = trunc <25 x i64> [[L]] to <25 x i16>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i16]* {{.*}} to <25 x i16>*
+  // CHECK-NEXT:  store <25 x i16> [[CONV]], <25 x i16>* [[CONV1]], align 2
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<unsigned long int> l;
+  matrix_5_5<unsigned short int> s;
+  s = static_cast<matrix_5_5<unsigned short int>>(l);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z31CastUnsignedShortIntToIntCStylev()
+void CastUnsignedShortIntToIntCStyle() {
   // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
   // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
@@ -161,8 +303,21 @@ void CastUnsignedShortIntToInt() {
   i = (matrix_5_5<int>)u;
 }
 
-// CHECK-LABEL: define{{.*}} void @_Z24CastIntToUnsignedLongIntv()
-void CastIntToUnsignedLongInt() {
+// CHECK-LABEL: define{{.*}} void @_Z35CastUnsignedShortIntToIntStaticCastv()
+void CastUnsignedShortIntToIntStaticCast() {
+  // CHECK:       [[U:%.*]] = load <25 x i16>, <25 x i16>* %0, align 2
+  // CHECK-NEXT:  [[CONV:%.*]] = zext <25 x i16> [[U]] to <25 x i32>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i32]* {{.*}} to <25 x i32>*
+  // CHECK-NEXT:  store <25 x i32> [[CONV]], <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<unsigned short int> u;
+  matrix_5_5<int> i;
+  i = static_cast<matrix_5_5<int>>(u);
+}
+
+// CHECK-LABEL: define{{.*}} void @_Z30CastIntToUnsignedLongIntCStylev()
+void CastIntToUnsignedLongIntCStyle() {
   // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
   // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
   // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
@@ -173,3 +328,16 @@ void CastIntToUnsignedLongInt() {
   matrix_5_5<unsigned long int> u;
   u = (matrix_5_5<unsigned long int>)i;
 }
+
+// CHECK-LABEL: define{{.*}} void @_Z34CastIntToUnsignedLongIntStaticCastv()
+void CastIntToUnsignedLongIntStaticCast() {
+  // CHECK:       [[I:%.*]] = load <25 x i32>, <25 x i32>* %0, align 4
+  // CHECK-NEXT:  [[CONV:%.*]] = sext <25 x i32> [[I]] to <25 x i64>
+  // CHECK-NEXT:  [[CONV1:%.*]] = bitcast [25 x i64]* {{.*}} to <25 x i64>*
+  // CHECK-NEXT:  store <25 x i64> [[CONV]], <25 x i64>* {{.*}}, align 8
+  // CHECK-NEXT:  ret void
+
+  matrix_5_5<int> i;
+  matrix_5_5<unsigned long int> u;
+  u = static_cast<matrix_5_5<unsigned long int>>(i);
+}

diff  --git a/clang/test/SemaCXX/matrix-casts.cpp b/clang/test/SemaCXX/matrix-casts.cpp
index 5593f269a4202..33ba24913bac5 100644
--- a/clang/test/SemaCXX/matrix-casts.cpp
+++ b/clang/test/SemaCXX/matrix-casts.cpp
@@ -46,6 +46,37 @@ void f1() {
 }
 
 void f2() {
+  matrix_4_4<char> m1;
+  matrix_4_4<int> m2;
+  matrix_4_4<short> m3;
+  matrix_5_5<int> m4;
+  int i;
+  vec v;
+  test_struct *s;
+
+  m2 = static_cast<matrix_4_4<int>>(m1);
+  m3 = static_cast<matrix_4_4<short>>(m2);
+  static_cast<matrix_5_5<int>>(m3); // expected-error {{conversion between matrix types 'matrix_5_5<int>' (aka 'int __attribute__\
+((matrix_type(5, 5)))') and 'matrix_4_4<short>' (aka 'short __attribute__((matrix_type(4, 4)))') of 
diff erent size is not\
+ allowed}}
+
+  static_cast<int>(m3);            // expected-error {{conversion between matrix type 'matrix_4_4<short>' (aka 'short __attribute__\
+((matrix_type(4, 4)))') and incompatible type 'int' is not allowed}}
+  static_cast<matrix_4_4<int>>(i); // expected-error {{conversion between matrix type 'matrix_4_4<int>' (aka 'int __attribute__\
+((matrix_type(4, 4)))') and incompatible type 'int' is not allowed}}
+
+  static_cast<vec>(m2);             // expected-error {{conversion between matrix type 'matrix_4_4<int>' (aka 'int __attribute__\
+((matrix_type(4, 4)))') and incompatible type 'vec' (vector of 1 'int' value) is not allowed}}
+  static_cast<matrix_4_4<char>>(v); // expected-error {{conversion between matrix type 'matrix_4_4<char>' (aka 'char __attribute__\
+((matrix_type(4, 4)))') and incompatible type 'vec' (vector of 1 'int' value) is not allowed}}
+
+  static_cast<test_struct *>(m1);    // expected-error {{conversion between matrix type 'matrix_4_4<char>' (aka 'char __attribute__\
+((matrix_type(4, 4)))') and incompatible type 'test_struct *' is not allowed}}'
+  static_cast<matrix_5_5<float>>(s); // expected-error {{conversion between matrix type 'matrix_5_5<float>' (aka 'float __attribute__\
+((matrix_type(5, 5)))') and incompatible type 'test_struct *' is not allowed}}'
+}
+
+void f3() {
   matrix_4_4<float> m1;
   matrix_4_4<double> m2;
   matrix_5_5<double> m3;
@@ -65,3 +96,24 @@ __attribute__((matrix_type(4, 4)))') from incompatible type 'matrix_5_5<unsigned
   m6 = (matrix_5_5<unsigned int>)m4;
   m4 = (matrix_5_5<signed int>)m6;
 }
+
+void f4() {
+  matrix_4_4<float> m1;
+  matrix_4_4<double> m2;
+  matrix_5_5<double> m3;
+  matrix_5_5<signed int> m4;
+  matrix_4_4<unsigned int> m5;
+  matrix_5_5<unsigned int> m6;
+  float f;
+
+  m2 = static_cast<matrix_4_4<double>>(m1);
+  static_cast<matrix_5_5<double>>(m1); // expected-error {{conversion between matrix types 'matrix_5_5<double>' (aka 'double __\
+attribute__((matrix_type(5, 5)))') and 'matrix_4_4<float>' (aka 'float __attribute__((matrix_type(4, 4)))') of 
diff erent\
+ size is not allowed}}
+  m4 = static_cast<matrix_5_5<signed int>>(m3);
+  m5 = static_cast<matrix_5_5<unsigned int>>(m4); // expected-error {{assigning to 'matrix_4_4<unsigned int>' (aka 'unsigned int \
+__attribute__((matrix_type(4, 4)))') from incompatible type 'matrix_5_5<unsigned int>' (aka 'unsigned int __attribute__\
+((matrix_type(5, 5)))')}}
+  m6 = static_cast<matrix_5_5<unsigned int>>(m4);
+  m4 = static_cast<matrix_5_5<signed int>>(m6);
+}


        


More information about the cfe-commits mailing list