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);
+}

Reply via email to