On 4/5/24 14:47, Marek Polacek wrote:
On Fri, Apr 05, 2024 at 09:40:48AM +0200, Jakub Jelinek wrote:
Hi!

When looking at maybe_warn_for_constant_evaluated for the trivial
infinite loops patch, I've noticed that it can emit weird diagnostics
for if constexpr in templates, first warn that std::is_constant_evaluted()
always evaluates to false (because the function template is not constexpr)
and then during instantiation warn that std::is_constant_evaluted()
always evaluates to true (because it is used in if constexpr condition).
Now, only the latter is actually true, even when the if constexpr
is in a non-constexpr function, it will still always evaluate to true.

So, the following patch fixes it to call maybe_warn_for_constant_evaluated
always with IF_STMT_CONSTEXPR_P (if_stmt) as the second argument rather than
true if it is if constexpr with non-dependent condition etc.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-04-05  Jakub Jelinek  <ja...@redhat.com>

        PR c++/114580
        * semantics.cc (finish_if_stmt_cond): Call
        maybe_warn_for_constant_evaluated with IF_STMT_CONSTEXPR_P (if_stmt)
        as the second argument, rather than true/false depending on if
        it is if constexpr with non-dependent constant expression with
        bool type.

        * g++.dg/cpp2a/is-constant-evaluated15.C: New test.

--- gcc/cp/semantics.cc.jj      2024-04-03 09:58:33.407772541 +0200
+++ gcc/cp/semantics.cc 2024-04-04 12:11:36.203886572 +0200
@@ -1126,6 +1126,9 @@ tree
  finish_if_stmt_cond (tree orig_cond, tree if_stmt)
  {
    tree cond = maybe_convert_cond (orig_cond);
+  maybe_warn_for_constant_evaluated (cond,
+                                    /*constexpr_if=*/
+                                    IF_STMT_CONSTEXPR_P (if_stmt));

I don't think we need the comment anymore since it's clear what the
argument does, and then the whole call can fit on a single line.

But either way, the patch looks good, thanks.

Agreed, OK with that change.

Jason

Reply via email to