diff options
author | Marek Polacek <polacek@redhat.com> | 2020-01-22 11:44:13 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-01-22 11:44:13 -0500 |
commit | 15ed55eabb0cf8a2974b8025a9f46c9e58960811 (patch) | |
tree | 4f2efc2b13abc0a38a5ff2385d61e6ef30fd27a0 /gcc | |
parent | bf91504dc23f17248df6302f7bad849f3ddedee7 (diff) | |
download | gcc-15ed55eabb0cf8a2974b8025a9f46c9e58960811.zip gcc-15ed55eabb0cf8a2974b8025a9f46c9e58960811.tar.gz gcc-15ed55eabb0cf8a2974b8025a9f46c9e58960811.tar.bz2 |
PR c++/93324 - ICE with -Wall on constexpr if.
This is a crash with constexpr if, when trying to see if the call in
the if-statement is std::is_constant_evaluated.
cp_get_callee_fndecl_nofold can return NULL_TREE and fndecl_built_in_p
doesn't expect to get a null tree, so check FNDECL first.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C | 16 |
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3d58238..d994699 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-01-22 Marek Polacek <polacek@redhat.com> + + PR c++/93324 - ICE with -Wall on constexpr if. + * semantics.c (is_std_constant_evaluated_p): Check fndecl. + 2020-01-22 Patrick Palka <ppalka@redhat.com> * constraint.cc (get_mapped_args): Avoid using auto_vec diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 3669b24..3b88f15 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -734,6 +734,9 @@ is_std_constant_evaluated_p (tree fn) return false; tree fndecl = cp_get_callee_fndecl_nofold (fn); + if (fndecl == NULL_TREE) + return false; + if (fndecl_built_in_p (fndecl, CP_BUILT_IN_IS_CONSTANT_EVALUATED, BUILT_IN_FRONTEND)) return true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d22747b..70d7e88 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-22 Marek Polacek <polacek@redhat.com> + + PR c++/93324 - ICE with -Wall on constexpr if. + * g++.dg/cpp1z/constexpr-if33.C: New test. + 2020-01-22 Richard Sandiford <richard.sandiford@arm.com> * gcc.target/aarch64/sve/acle/general/stack_vars_1.c: New test. diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C new file mode 100644 index 0000000..e5ef659 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C @@ -0,0 +1,16 @@ +// PR c++/93324 - ICE with -Wall on constexpr if. +// { dg-do compile { target c++17 } } +// { dg-options "-Wall" } + +struct { + template <int> + static constexpr bool a() { return 0; } +} e; + +template <typename> +void d() +{ + auto c(e); + using b = decltype(c); + if constexpr (b::a<2>()); +} |