aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-01-22 11:44:13 -0500
committerMarek Polacek <polacek@redhat.com>2020-01-22 11:44:13 -0500
commit15ed55eabb0cf8a2974b8025a9f46c9e58960811 (patch)
tree4f2efc2b13abc0a38a5ff2385d61e6ef30fd27a0
parentbf91504dc23f17248df6302f7bad849f3ddedee7 (diff)
downloadgcc-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.
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if33.C16
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>());
+}