On Wed, Apr 06, 2022 at 04:36:49PM -0300, Alexandre Oliva via Gcc-patches wrote: > > On targets that return this from cdtors, cxx_eval_call_expression may > flag flowing off the end of a dtor. That's preempted for ctors, and > avoided entirely when dtors return void, but when they return this, > the return value should be conceptually disregarded, without making > room for such internal ABI details to make a program ill-formed, as in > g++.dg/cpp2a/constexpr-dtor12.C on arm-eabi. > > Regstrapped on x86_64-linux-gnu, also verified the testcase fix on > arm-eabi. Ok to install? > > > for gcc/cp/ChangeLog > > * constexpr.cc (cxx_eval_call_expression): Disregard dtor > result. > --- > gcc/cp/constexpr.cc | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc > index 9c40b0515747d..d8bc864ae6bcc 100644 > --- a/gcc/cp/constexpr.cc > +++ b/gcc/cp/constexpr.cc > @@ -2889,7 +2889,8 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, > tree t, > else > { > result = *ctx->global->values.get (res); > - if (result == NULL_TREE && !*non_constant_p) > + if (result == NULL_TREE && !*non_constant_p > + && !DECL_DESTRUCTOR_P (fun))
Would it make sense to use && !(DECL_DESTRUCTOR_P (fun) && targetm.cxx.cdtor_returns_this ()) instead? > { > if (!ctx->quiet) > error ("%<constexpr%> call flows off the end " Marek