c++: Extend std::is_constant_evaluated in if warning [PR100995]
commit26dbe85a3781af913639b17bc966f4a0b8209f3b
authorMarek Polacek <polacek@redhat.com>
Wed, 9 Jun 2021 19:18:39 +0000 (9 15:18 -0400)
committerMarek Polacek <polacek@redhat.com>
Fri, 11 Jun 2021 02:32:21 +0000 (10 22:32 -0400)
tree7e1b0f3b3434d95a1287b7a8c7a4caddd42d5d14
parentedec2660ff4890ecf8cc191f7c92cf527de51fe2
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.
gcc/cp/constexpr.c
gcc/cp/cp-tree.h
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated12.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/is-constant-evaluated9.C