[clang] [Clang] [Sema] Support matrix types in pseudo-destructor expressions (PR #117483)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 4 00:44:38 PST 2024
https://github.com/Sirraide updated https://github.com/llvm/llvm-project/pull/117483
>From 4eff78b4f8404217cecf254227bc79dcc11d2f36 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Sun, 24 Nov 2024 13:43:02 +0100
Subject: [PATCH 1/2] [Clang] [Sema] Support matrix types in pseudo-destructor
expressions
---
clang/docs/ReleaseNotes.rst | 3 +++
clang/lib/Sema/SemaExprCXX.cpp | 2 +-
.../matrix-types-pseudo-destructor.cpp | 19 +++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
create mode 100644 clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8bd06fadfdc984..ad3c0d3e67f031 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -371,6 +371,9 @@ Non-comprehensive list of changes in this release
- ``__builtin_reduce_and`` function can now be used in constant expressions.
- ``__builtin_reduce_or`` and ``__builtin_reduce_xor`` functions can now be used in constant expressions.
+- 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 d85819b21c8265..d440755ee70665 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -8189,7 +8189,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/SemaCXX/matrix-types-pseudo-destructor.cpp b/clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp
new file mode 100644
index 00000000000000..f0ee953ad2557c
--- /dev/null
+++ b/clang/test/SemaCXX/matrix-types-pseudo-destructor.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -fsyntax-only -fenable-matrix -std=c++11 -verify %s
+// expected-no-diagnostics
+
+template <typename T>
+void f() {
+ T().~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>>();
+}
>From 748f28ec638d5344c7e83dd42cc7945fa58d2341 Mon Sep 17 00:00:00 2001
From: Sirraide <aeternalmail at gmail.com>
Date: Wed, 4 Dec 2024 09:44:28 +0100
Subject: [PATCH 2/2] Add some codegen tests
---
clang/test/CodeGenCXX/matrix-type.cpp | 33 +++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
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);
+}
More information about the cfe-commits
mailing list