aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Martin <simon@nasilyan.com>2025-01-16 16:27:06 +0100
committerSimon Martin <simon@nasilyan.com>2025-01-16 21:06:24 +0100
commit37f38b0f97374476a4818b68c8df991886428787 (patch)
tree3a6669c6a6089a4097f529650918fa2ab06e46eb
parent99bcce0d89b8a9aa9a1cc481b41be101c07d8bdf (diff)
downloadgcc-37f38b0f97374476a4818b68c8df991886428787.zip
gcc-37f38b0f97374476a4818b68c8df991886428787.tar.gz
gcc-37f38b0f97374476a4818b68c8df991886428787.tar.bz2
c++: Make sure fold_sizeof_expr returns the correct type [PR117775]
We currently ICE upon the following code, that is valid under -Wno-pointer-arith: === cut here === int main() { decltype( [](auto) { return sizeof(void); } ) x; return x.operator()(0); } === cut here === The problem is that "fold_sizeof_expr (sizeof(void))" returns size_one_node, that has a different TREE_TYPE from that of the sizeof expression, which later triggers an assert in cxx_eval_store_expression. This patch makes sure that fold_sizeof_expr always returns a tree with the size_type_node type. PR c++/117775 gcc/cp/ChangeLog: * decl.cc (fold_sizeof_expr): Make sure the folded result has type size_type_node. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/constexpr-117775.C: New test.
-rw-r--r--gcc/cp/decl.cc1
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C13
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index e5f8cd7..ef88791 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -11921,6 +11921,7 @@ fold_sizeof_expr (tree t)
false, false);
if (r == error_mark_node)
r = size_one_node;
+ r = cp_fold_convert (size_type_node, r);
return r;
}
diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C b/gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C
new file mode 100644
index 0000000..59fc0d3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C
@@ -0,0 +1,13 @@
+// PR c++/117775
+// Check that we don't ICE and have sizeof(void)==1 under -Wno-pointer-arith
+// { dg-do run { target c++20 } }
+// { dg-additional-options "-Wno-pointer-arith" }
+
+int main() {
+ struct why :
+ decltype( [](auto) {
+ return sizeof(void);
+ })
+ {} x;
+ return 1 - x.operator()(0);
+}