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