[PATCH] D103163: [Matrix] Skip matrix casts checks for class or struct types in C++.

Florian Hahn via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 26 15:08:01 PDT 2021


fhahn updated this revision to Diff 348106.
fhahn added a comment.

Fix IR checks, which broke after adding fields to the struct/class used in the tests.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D103163/new/

https://reviews.llvm.org/D103163

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


Index: clang/test/SemaCXX/matrix-casts.cpp
===================================================================
--- clang/test/SemaCXX/matrix-casts.cpp
+++ clang/test/SemaCXX/matrix-casts.cpp
@@ -117,3 +117,33 @@
   m6 = static_cast<matrix_5_5<unsigned int>>(m4);
   m4 = static_cast<matrix_5_5<signed int>>(m6);
 }
+
+class Foo {
+  // expected-note at -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}}
+  // expected-note at -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}}
+
+  int x;
+
+public:
+  Foo();
+  // expected-note at -1 {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
+  Foo(matrix_5_5<int> x);
+  // expected-note at -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}}
+};
+
+struct Bar {
+  // expected-note at -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}}
+  // expected-note at -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}}
+  // expected-note at -3 {{candidate constructor (the implicit default constructor) not viable: requires 0 arguments, but 1 was provided}}
+  float x;
+};
+
+void f5_constructors() {
+  matrix_4_4<float> m1;
+  matrix_4_4<unsigned int> m5;
+
+  Foo F = Foo(m1);
+  // expected-error at -1 {{no matching conversion for functional-style cast from 'matrix_4_4<float>' (aka 'float __attribute__((matrix_type(4, 4)))') to 'Foo'}}
+  Bar B = Bar(m5);
+  // expected-error at -1 {{no matching conversion for functional-style cast from 'matrix_4_4<unsigned int>' (aka 'unsigned int __attribute__((matrix_type(4, 4)))') to 'Bar'}}
+}
Index: clang/test/CodeGenCXX/matrix-casts.cpp
===================================================================
--- clang/test/CodeGenCXX/matrix-casts.cpp
+++ clang/test/CodeGenCXX/matrix-casts.cpp
@@ -341,3 +341,33 @@
   matrix_5_5<unsigned long int> u;
   u = static_cast<matrix_5_5<unsigned long int>>(i);
 }
+
+class Foo {
+  int x[10];
+
+public:
+  Foo(matrix_5_5<int> x);
+};
+
+Foo class_constructor_matrix_ty(matrix_5_5<int> m) {
+  // CHECK-LABEL: define void @_Z27class_constructor_matrix_tyu11matrix_typeILm5ELm5EiE(%class.Foo* noalias sret(%class.Foo) align 4 %agg.result, <25 x i32> %m)
+  // CHECK:         [[M:%.*]]  = load <25 x i32>, <25 x i32>* {{.*}}, align 4
+  // CHECK-NEXT:    call void @_ZN3FooC1Eu11matrix_typeILm5ELm5EiE(%class.Foo* nonnull align 4 dereferenceable(40) %agg.result, <25 x i32> [[M]])
+  // CHECK-NEXT:    ret void
+
+  return Foo(m);
+}
+
+struct Bar {
+  float x[10];
+  Bar(matrix_4_4<float> x);
+};
+
+Bar struct_constructor_matrix_ty(matrix_4_4<float> m) {
+  // CHECK-LABEL: define void @_Z28struct_constructor_matrix_tyu11matrix_typeILm4ELm4EfE(%struct.Bar* noalias sret(%struct.Bar) align 4 %agg.result, <16 x float> %m)
+  // CHECK:         [[M:%.*]] = load <16 x float>, <16 x float>* {{.*}}, align 4
+  // CHECK-NEXT:    call void @_ZN3BarC1Eu11matrix_typeILm4ELm4EfE(%struct.Bar* nonnull align 4 dereferenceable(40) %agg.result, <16 x float> [[M]])
+  // CHECK-NEXT:    ret void
+
+  return Bar(m);
+}
Index: clang/lib/Sema/SemaCast.cpp
===================================================================
--- clang/lib/Sema/SemaCast.cpp
+++ clang/lib/Sema/SemaCast.cpp
@@ -2665,8 +2665,13 @@
       return;
   }
 
-  if (DestType->getAs<MatrixType>() ||
-      SrcExpr.get()->getType()->getAs<MatrixType>()) {
+  // If the destination types is not a class or struct type and either the
+  // destination or source type is a matrix type, perform & check a matrix cast.
+  // If the destination type is a class or struct, check against their
+  // constructors later.
+  if (!DestType->isStructureOrClassType() &&
+      (DestType->getAs<MatrixType>() ||
+       SrcExpr.get()->getType()->getAs<MatrixType>())) {
     if (Self.CheckMatrixCast(OpRange, DestType, SrcExpr.get()->getType(), Kind))
       SrcExpr = ExprError();
     return;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103163.348106.patch
Type: text/x-patch
Size: 4553 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210526/6f97c385/attachment.bin>


More information about the cfe-commits mailing list