Author: Sirraide Date: 2024-12-17T06:49:31+01:00 New Revision: eb5c21108fca4c871987faef581158811954c916
URL: https://github.com/llvm/llvm-project/commit/eb5c21108fca4c871987faef581158811954c916 DIFF: https://github.com/llvm/llvm-project/commit/eb5c21108fca4c871987faef581158811954c916.diff LOG: [Clang] [Sema] Support matrix types in pseudo-destructor expressions (#117483) We already support vector types, and since matrix element types have to be scalar types, there should be no problem w/ just enabling this. This now also allows matrix types to be stored in STL containers. Added: clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaExprCXX.cpp clang/test/CodeGenCXX/matrix-type.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 38aab8c7d32cad..596f3b5142d663 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -419,6 +419,9 @@ Non-comprehensive list of changes in this release - Clang now rejects ``_BitInt`` matrix element types if the bit width is less than ``CHAR_WIDTH`` or not a power of two, matching preexisting behaviour for vector types. +- Matrix types (a Clang extension) can now be used in pseudo-destructor expressions, + which allows them to be stored in STL containers. + New Compiler Flags ------------------ diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index caea13b192ad57..e04ece0bda82eb 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -8201,7 +8201,7 @@ ExprResult Sema::BuildPseudoDestructorExpr(Expr *Base, return ExprError(); if (!ObjectType->isDependentType() && !ObjectType->isScalarType() && - !ObjectType->isVectorType()) { + !ObjectType->isVectorType() && !ObjectType->isMatrixType()) { if (getLangOpts().MSVCCompat && ObjectType->isVoidType()) Diag(OpLoc, diag::ext_pseudo_dtor_on_void) << Base->getSourceRange(); else { diff --git a/clang/test/CodeGenCXX/matrix-type.cpp b/clang/test/CodeGenCXX/matrix-type.cpp index 1a5e5dba2978c8..c3a299e7feee82 100644 --- a/clang/test/CodeGenCXX/matrix-type.cpp +++ b/clang/test/CodeGenCXX/matrix-type.cpp @@ -368,3 +368,36 @@ void test_use_matrix_2() { selector<2> r5 = use_matrix_3(m1); } + +// CHECK-LABEL: define void @_Z22test_pseudo_destructorv() +// CHECK-NEXT: entry: +// CHECK-NEXT: %a = alloca [25 x double], align 8 +// CHECK-NEXT: %b = alloca [12 x float], align 4 +// CHECK-NEXT: %0 = load <25 x double>, ptr %a, align 8 +// CHECK-NEXT: call void @_Z17pseudo_destructorIu11matrix_typeILm5ELm5EdEEvT_(<25 x double> %0) +// CHECK-NEXT: %1 = load <12 x float>, ptr %b, align 4 +// CHECK-NEXT: call void @_Z17pseudo_destructorIu11matrix_typeILm3ELm4EfEEvT_(<12 x float> %1) +// CHECK-NEXT: ret void + +// CHECK-LABEL: define linkonce_odr void @_Z17pseudo_destructorIu11matrix_typeILm5ELm5EdEEvT_(<25 x double> %t) +// CHECK-NEXT: entry: +// CHECK-NEXT: %t.addr = alloca [25 x double], align 8 +// CHECK-NEXT: store <25 x double> %t, ptr %t.addr, align 8 +// CHECK-NEXT: ret void + +// CHECK-LABEL: define linkonce_odr void @_Z17pseudo_destructorIu11matrix_typeILm3ELm4EfEEvT_(<12 x float> %t) +// CHECK-NEXT: entry: +// CHECK-NEXT: %t.addr = alloca [12 x float], align 4 +// CHECK-NEXT: store <12 x float> %t, ptr %t.addr, align 4 +// CHECK-NEXT: ret void +template <typename T> +void pseudo_destructor(T t) { + t.~T(); +} + +void test_pseudo_destructor() { + dx5x5_t a; + fx3x4_t b; + pseudo_destructor(a); + pseudo_destructor(b); +} diff --git a/clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp b/clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp new file mode 100644 index 00000000000000..b5a1b8c8a452a2 --- /dev/null +++ b/clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -fsyntax-only -fenable-matrix -verify %s +// expected-no-diagnostics + +template <typename T> +void f() { + T().~T(); +} + +template <typename T> +void f1(T *f) { + f->~T(); + (*f).~T(); +} + +using mat4 = float __attribute__((matrix_type(4, 4))); +using mat4i = int __attribute__((matrix_type(4, 4))); + +template <typename T> +using mat4_t = T __attribute__((matrix_type(4, 4))); + +void g() { + f<mat4>(); + f<mat4i>(); + f<mat4_t<double>>(); +} + +void g2(mat4* m1, mat4i* m2, mat4_t<double>* m3) { + f1(m1); + f1(m2); + f1(m3); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits