public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/100995] New: Extend std::is_constant_evaluated in if warning
@ 2021-06-09 15:08 mpolacek at gcc dot gnu.org
2021-06-09 15:09 ` [Bug c++/100995] " mpolacek at gcc dot gnu.org
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2021-06-09 15:08 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100995
Bug ID: 100995
Summary: Extend std::is_constant_evaluated in if warning
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: mpolacek at gcc dot gnu.org
Target Milestone: ---
Let's extend the existing warning to detect more cases, as in
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1938r3.html#compiler-warnings
constexpr int f1() {
if constexpr (!std::is_constant_evaluated() && sizeof(int) == 4) { //
warning: always true
return 0;
}
if (std::is_constant_evaluated()) {
return 42;
} else {
if constexpr (std::is_constant_evaluated()) { // warning: always true
return 0;
}
}
return 7;
}
consteval int f2() {
if (std::is_constant_evaluated() && f1()) { // warning: always true
return 42;
}
return 7;
}
int f3() {
if (std::is_constant_evaluated() && f1()) { // warning: always false
return 42;
}
return 7;
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/100995] Extend std::is_constant_evaluated in if warning
2021-06-09 15:08 [Bug c++/100995] New: Extend std::is_constant_evaluated in if warning mpolacek at gcc dot gnu.org
@ 2021-06-09 15:09 ` mpolacek at gcc dot gnu.org
2021-06-09 16:09 ` jakub at gcc dot gnu.org
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2021-06-09 15:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100995
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Ever confirmed|0 |1
Keywords| |diagnostic
Assignee|unassigned at gcc dot gnu.org |mpolacek at gcc dot gnu.org
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2021-06-09
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/100995] Extend std::is_constant_evaluated in if warning
2021-06-09 15:08 [Bug c++/100995] New: Extend std::is_constant_evaluated in if warning mpolacek at gcc dot gnu.org
2021-06-09 15:09 ` [Bug c++/100995] " mpolacek at gcc dot gnu.org
@ 2021-06-09 16:09 ` jakub at gcc dot gnu.org
2021-06-11 2:32 ` cvs-commit at gcc dot gnu.org
2021-06-11 2:33 ` mpolacek at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-06-09 16:09 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100995
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
namespace std {
constexpr inline bool
is_constant_evaluated () noexcept
{
return __builtin_is_constant_evaluated ();
}
}
int
foo ()
{
if (std::is_constant_evaluated ())
return 1;
return 0;
}
constexpr int
bar ()
{
if (std::is_constant_evaluated ())
return 1;
if constexpr (std::is_constant_evaluated ())
return 2;
return 0;
}
consteval int
baz ()
{
if (std::is_constant_evaluated ())
return 1;
return 0;
}
In foo, we know it will always evaluate to false, in baz always to true.
In non-constexpr functions it will not evaluate everywhere to false, so one
would need to leave out e.g. initializers of static variables and the other
spots which are manifestly constant evaluated.
But say if conditions except for statement expressions in them and if it is not
the init might be always ok and good enough for the warning.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/100995] Extend std::is_constant_evaluated in if warning
2021-06-09 15:08 [Bug c++/100995] New: Extend std::is_constant_evaluated in if warning mpolacek at gcc dot gnu.org
2021-06-09 15:09 ` [Bug c++/100995] " mpolacek at gcc dot gnu.org
2021-06-09 16:09 ` jakub at gcc dot gnu.org
@ 2021-06-11 2:32 ` cvs-commit at gcc dot gnu.org
2021-06-11 2:33 ` mpolacek at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-06-11 2:32 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100995
--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>:
https://gcc.gnu.org/g:26dbe85a3781af913639b17bc966f4a0b8209f3b
commit r12-1375-g26dbe85a3781af913639b17bc966f4a0b8209f3b
Author: Marek Polacek <polacek@redhat.com>
Date: Wed Jun 9 15:18:39 2021 -0400
c++: Extend std::is_constant_evaluated in if warning [PR100995]
Jakub pointed me at
<http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p1938r3.html#compiler-warnings>
which shows that our existing warning could be extended to handle more
cases. This patch implements that.
A minor annoyance was handling macros, in libstdc++ we have
reference operator[](size_type __pos) {
__glibcxx_assert(__pos <= size());
...
}
wherein __glibcxx_assert expands to
if (__builtin_is_constant_evaluated() && !bool(__pos <= size())
...
but I'm of a mind to not warn on that.
Once consteval if makes it in, we should tweak this warning one more
time.
PR c++/100995
gcc/cp/ChangeLog:
* constexpr.c (maybe_constexpr_fn): New.
* cp-tree.h (maybe_constexpr_fn): Declare.
* semantics.c (find_std_constant_evaluated_r): New.
(maybe_warn_for_constant_evaluated): New.
(finish_if_stmt_cond): Call it.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/is-constant-evaluated9.C: Add dg-warning.
* g++.dg/cpp2a/is-constant-evaluated12.C: New test.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/100995] Extend std::is_constant_evaluated in if warning
2021-06-09 15:08 [Bug c++/100995] New: Extend std::is_constant_evaluated in if warning mpolacek at gcc dot gnu.org
` (2 preceding siblings ...)
2021-06-11 2:32 ` cvs-commit at gcc dot gnu.org
@ 2021-06-11 2:33 ` mpolacek at gcc dot gnu.org
3 siblings, 0 replies; 5+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2021-06-11 2:33 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100995
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Resolution|--- |FIXED
Status|ASSIGNED |RESOLVED
--- Comment #3 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Done.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-06-11 2:33 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-09 15:08 [Bug c++/100995] New: Extend std::is_constant_evaluated in if warning mpolacek at gcc dot gnu.org
2021-06-09 15:09 ` [Bug c++/100995] " mpolacek at gcc dot gnu.org
2021-06-09 16:09 ` jakub at gcc dot gnu.org
2021-06-11 2:32 ` cvs-commit at gcc dot gnu.org
2021-06-11 2:33 ` mpolacek at gcc dot gnu.org
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).