https://gcc.gnu.org/g:fa248a92134c0681719702e60c369b916d4f8bf9
commit r13-9329-gfa248a92134c0681719702e60c369b916d4f8bf9 Author: Simon Martin <si...@nasilyan.com> Date: Thu Jan 16 16:27:06 2025 +0100 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. (cherry picked from commit 37f38b0f97374476a4818b68c8df991886428787) Diff: --- gcc/cp/decl.cc | 1 + gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index dbd1ee664c60..8f902fb1d114 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -11210,6 +11210,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 000000000000..59fc0d332b92 --- /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); +}