aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-03-22 08:08:07 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-03-22 08:08:07 +0000
commit08ad2797c60b66f8a6ca54652cdead0aa6ea721f (patch)
treef9899378cfb63c1e7528b102e9bd49112f356ce1
parent2170d4b6ddca526b53e87215dbf6fab5973000c7 (diff)
downloadgcc-08ad2797c60b66f8a6ca54652cdead0aa6ea721f.zip
gcc-08ad2797c60b66f8a6ca54652cdead0aa6ea721f.tar.gz
gcc-08ad2797c60b66f8a6ca54652cdead0aa6ea721f.tar.bz2
re PR c++/84854 (ICE: unexpected expression in cxx_eval_constant_expression, at cp/constexpr.c:4774)
PR c++/84854 * semantics.c (finish_if_stmt_cond): Check if the type of the condition is boolean. * g++.dg/cpp1z/constexpr-if15.C: New test. * g++.dg/cpp1z/constexpr-if16.C: New test. From-SVN: r258756
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if15.C11
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/constexpr-if16.C20
5 files changed, 47 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 44de2fb..f9e7a57 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-22 Marek Polacek <polacek@redhat.com>
+
+ PR c++/84854
+ * semantics.c (finish_if_stmt_cond): Check if the type of the condition
+ is boolean.
+
2018-03-21 Jason Merrill <jason@redhat.com>
PR c++/81311 - wrong C++17 overload resolution.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 4b9fc27..97fa57a 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -733,7 +733,10 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
if (IF_STMT_CONSTEXPR_P (if_stmt)
&& !type_dependent_expression_p (cond)
&& require_constant_expression (cond)
- && !value_dependent_expression_p (cond))
+ && !value_dependent_expression_p (cond)
+ /* Wait until instantiation time, since only then COND has been
+ converted to bool. */
+ && TREE_TYPE (cond) == boolean_type_node)
{
cond = instantiate_non_dependent_expr (cond);
cond = cxx_constant_value (cond, NULL_TREE);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cc4cbbc..00b804c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-22 Marek Polacek <polacek@redhat.com>
+
+ PR c++/84854
+ * g++.dg/cpp1z/constexpr-if15.C: New test.
+ * g++.dg/cpp1z/constexpr-if16.C: New test.
+
2018-03-21 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/builtin-tgmath-3.c: New test.
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if15.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if15.C
new file mode 100644
index 0000000..9a9053c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if15.C
@@ -0,0 +1,11 @@
+// PR c++/84854
+// { dg-options -std=c++17 }
+
+constexpr int foo () { return 1; }
+constexpr int foo (int) { return 2; }
+
+template <typename>
+void a()
+{
+ if constexpr(foo) { };
+}
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if16.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if16.C
new file mode 100644
index 0000000..31a1497
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1z/constexpr-if16.C
@@ -0,0 +1,20 @@
+// { dg-options -std=c++17 }
+
+struct A
+{
+ constexpr operator bool () { return true; }
+ int i;
+};
+
+A a;
+
+template <class T> void f()
+{
+ constexpr bool b = a;
+ if constexpr (a) { }
+}
+
+int main()
+{
+ f<int>();
+}