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
next prev parent 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).