public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jason Merrill <jason@redhat.com>
To: Marek Polacek <polacek@redhat.com>
Cc: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH v2] c++: Move consteval folding to cp_fold_r
Date: Thu, 7 Sep 2023 14:32:51 -0400	[thread overview]
Message-ID: <0bca25f4-c684-c56d-b919-8ffe2368e376@redhat.com> (raw)
In-Reply-To: <ZPnq6g4nFQzR/RKL@redhat.com>

On 9/7/23 11:23, Marek Polacek wrote:
> On Tue, Sep 05, 2023 at 04:36:34PM -0400, Jason Merrill wrote:
>> On 9/5/23 15:59, Marek Polacek wrote:
>>> On Tue, Sep 05, 2023 at 10:52:04AM -0400, Jason Merrill wrote:
>>>> On 9/1/23 13:23, Marek Polacek wrote:
>>>>> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
>>>>>
>>>>> -- >8 --
>>>>>
>>>>> In the review of P2564:
>>>>> <https://gcc.gnu.org/pipermail/gcc-patches/2023-August/628747.html>
>>>>> it turned out that in order to correctly handle an example in the paper,
>>>>> we should stop doing immediate evaluation in build_over_call and
>>>>> bot_replace, and instead do it in cp_fold_r.  This patch does that.
>>>>>
>>>>> Another benefit is that this is a pretty significant simplification, at
>>>>> least in my opinion.  Also, this fixes the c++/110997 ICE (but the test
>>>>> doesn't compile yet).
>>>>>
>>>>> The main drawback seems to be that cp_fold_r doesn't process as much
>>>>> code as we did before: uninstantiated templates
>>>>
>>>> That's acceptable, it's an optional diagnostic.
>>>>
>>>>> and things like "false ? foo () : 1".
>>>>
>>>> This is a problem.  Maybe we want cp_fold_r to recurse into the arms of a
>>>> COND_EXPR before folding them away?  Maybe only if we know we've seen an
>>>> immediate function?
>>>
>>> Unfortunately we had already thrown the dead branch away when we got to
>>> cp_fold_r.  I wonder if we have to adjust cxx_eval_conditional_expression
>>> to call cp_fold_r on the dead branch too,
>>
>> Hmm, I guess so.
>>
>>> perhaps with a new ff_ flag to skip the whole second switch in cp_fold_r?
>>
>> Or factor out the immediate function handling to a separate walk function
>> that cp_fold_r also calls?
> 
> I did that.
>   
>>> But then it's possible that the in_immediate_context checks have to stay.
>>
>> We can just not do the walk in immediate (or mce_true) context, like we
>> currently avoid calling cp_fold_function.
> 
> Right.  Unfortunately I have to check even when mce_true, consider
> 
>    consteval int bar (int i) { if (i != 1) throw 1; return 0; }
>    constexpr int a = 0 ? bar(3) : 3;

I disagree; the call is in a manifestly constant-evaluated expression, 
and so is now considered an immediate function context, and we should 
accept that example.

>> For mce_unknown I guess we'd want
>> to set *non_constant_p instead of giving an error.
> 
> I did not do this because I haven't found a case where it would make
> a difference.

I think it will given the above comment.

> diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
> index 0ca4370deab..397d5c7ec3f 100644
> --- a/gcc/cp/constexpr.cc
> +++ b/gcc/cp/constexpr.cc
> @@ -2311,6 +2311,29 @@ cxx_dynamic_cast_fn_p (tree fndecl)
>   	  && CP_DECL_CONTEXT (fndecl) == abi_node);
>   }
>   
> +/* Return true if we are in the body of a consteval function. > +   This is in addition to in_immediate_context because that
> +   uses current_function_decl which may not be available.  CTX is
> +   the current constexpr context.  */
> +
> +static bool
> +in_immediate_context (const constexpr_ctx *ctx)
> +{
> +  if (in_immediate_context ())
> +    return true;

Can't we check for mce_true here instead of looking at the call chain?

> +/* A wrapper around cp_fold_immediate_r.  */
> +
> +void
> +cp_fold_immediate (tree *tp)
> +{

Maybe return early if consteval isn't supported in the active standard?

Jason


  reply	other threads:[~2023-09-07 18:32 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-01 17:23 [PATCH] " Marek Polacek
2023-09-01 17:36 ` Marek Polacek
2023-09-05 14:52 ` Jason Merrill
2023-09-05 19:59   ` Marek Polacek
2023-09-05 20:36     ` Jason Merrill
2023-09-07 15:23       ` [PATCH v2] " Marek Polacek
2023-09-07 18:32         ` Jason Merrill [this message]
2023-09-08 18:24           ` [PATCH v3] " Marek Polacek
2023-09-12 21:26             ` Jason Merrill
2023-09-13 20:56               ` [PATCH v4] " Marek Polacek
2023-09-13 21:57                 ` Jason Merrill
2023-09-14  0:02                   ` [PATCH v5] " Marek Polacek
2023-09-15 18:08                     ` Jason Merrill
2023-09-15 20:32                       ` [PATCH v6] " Marek Polacek
2023-09-16 20:22                         ` Jason Merrill
2023-09-18 21:42                           ` [PATCH v7] " Marek Polacek
2023-09-19  1:36                             ` Jason Merrill
2023-09-19 13:01                               ` Marek Polacek
2023-09-19 13:20                                 ` Jason Merrill

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0bca25f4-c684-c56d-b919-8ffe2368e376@redhat.com \
    --to=jason@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=polacek@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).