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).