diff options
author | Marek Polacek <polacek@redhat.com> | 2021-06-09 15:18:39 -0400 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2021-06-10 22:32:21 -0400 |
commit | 26dbe85a3781af913639b17bc966f4a0b8209f3b (patch) | |
tree | 7e1b0f3b3434d95a1287b7a8c7a4caddd42d5d14 /gcc/cp/constexpr.c | |
parent | edec2660ff4890ecf8cc191f7c92cf527de51fe2 (diff) | |
download | gcc-26dbe85a3781af913639b17bc966f4a0b8209f3b.zip gcc-26dbe85a3781af913639b17bc966f4a0b8209f3b.tar.gz gcc-26dbe85a3781af913639b17bc966f4a0b8209f3b.tar.bz2 |
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.
Diffstat (limited to 'gcc/cp/constexpr.c')
-rw-r--r-- | gcc/cp/constexpr.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 297f207..01b0c42 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -5121,6 +5121,16 @@ var_in_constexpr_fn (tree t) && DECL_DECLARED_CONSTEXPR_P (ctx)); } +/* True if a function might be constexpr: either a function that was + declared constexpr, or a C++17 lambda op(). */ + +bool +maybe_constexpr_fn (tree t) +{ + return (DECL_DECLARED_CONSTEXPR_P (t) + || (cxx_dialect >= cxx17 && LAMBDA_FUNCTION_P (t))); +} + /* True if T was declared in a function that might be constexpr: either a function that was declared constexpr, or a C++17 lambda op(). */ |