[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