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