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