PR c++/80562 - ICE with constexpr if.
authorJason Merrill <jason@redhat.com>
Mon, 19 Jun 2017 20:55:27 +0000 (16:55 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 19 Jun 2017 20:55:27 +0000 (16:55 -0400)
* semantics.c (finish_if_stmt_cond): Call
instantiate_non_dependent_expr.

From-SVN: r249387

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C [new file with mode: 0644]

index ff4280aebd10d4c5c1508b58389d4c9e8a1a616d..10d1ebd4859e5bce42875893bd2961a36f064d84 100644 (file)
@@ -1,5 +1,9 @@
 2017-06-19  Jason Merrill  <jason@redhat.com>
 
+       PR c++/80562 - ICE with constexpr if.
+       * semantics.c (finish_if_stmt_cond): Call
+       instantiate_non_dependent_expr.
+
        PR c++/80829 - ICE with constexpr copy of base subobject.
        * constexpr.c (clear_no_implicit_zero): New.
        (cxx_eval_call_expression): Call it.
index 5b5ec5483d1a4752df90e1b67dc3738a8f0ebf2a..5fe772a49e38982f424de8ae06ffc544af5805a0 100644 (file)
@@ -733,7 +733,10 @@ finish_if_stmt_cond (tree cond, tree if_stmt)
   if (IF_STMT_CONSTEXPR_P (if_stmt)
       && require_potential_rvalue_constant_expression (cond)
       && !value_dependent_expression_p (cond))
-    cond = cxx_constant_value (cond, NULL_TREE);
+    {
+      cond = instantiate_non_dependent_expr (cond);
+      cond = cxx_constant_value (cond, NULL_TREE);
+    }
   finish_cond (&IF_COND (if_stmt), cond);
   add_stmt (if_stmt);
   THEN_CLAUSE (if_stmt) = push_stmt_list ();
diff --git a/gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C b/gcc/testsuite/g++.dg/cpp1z/constexpr-if12.C
new file mode 100644 (file)
index 0000000..1ed2c30
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/80562
+// { dg-options -std=c++1z }
+
+struct T {
+  constexpr auto foo() { return false; }
+};
+
+template <class MustBeTemplate>
+constexpr auto bf(T t) {
+    if constexpr(t.foo()) {
+        return false;
+    }
+    return true;
+}