Hi,
On 29 Nov 2024, at 15:33, Simon Martin wrote:
> 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 type requested.
>
> Successfully tested on x86_64-pc-linux-gnu.
Ping.
Thanks!
Simon
>
> PR c++/117775
>
> gcc/cp/ChangeLog:
>
> * decl.cc (fold_sizeof_expr): Make sure the folded result has
> the requested TREE_TYPE.
>
> gcc/testsuite/ChangeLog:
>
> * g++.dg/cpp2a/constexpr-117775.C: New test.
>
> ---
> gcc/cp/decl.cc | 1 +
> gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C | 13 +++++++++++++
> 2 files changed, 14 insertions(+)
> create mode 100644 gcc/testsuite/g++.dg/cpp2a/constexpr-117775.C
>
> diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
> index 80485f0a428..fbe1407a2d2 100644
> --- a/gcc/cp/decl.cc
> +++ b/gcc/cp/decl.cc
> @@ -11686,6 +11686,7 @@ fold_sizeof_expr (tree t)
> false, false);
> if (r == error_mark_node)
> r = size_one_node;
> + r = cp_fold_convert (TREE_TYPE (t), 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 00000000000..59fc0d332b9
> --- /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);
> +}
> --
> 2.44.0