public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Fix c++/67371 (issues with throw in constexpr)
@ 2015-08-28 12:25 Markus Trippelsdorf
  2015-08-29  3:44 ` Jason Merrill
  0 siblings, 1 reply; 7+ messages in thread
From: Markus Trippelsdorf @ 2015-08-28 12:25 UTC (permalink / raw)
  To: gcc-patches; +Cc: Jason Merrill

As PR67371 shows gcc currently rejects all throw statements in
constant-expressions, even when they are never executed.

Fix by simply allowing THROW_EXPR in potential_constant_expression_1.

One drawback is that we now accept some ill formed cases, but they 
fall under the "no diagnostic required" rule in the standard, e.g.:

constexpr int f1() {
  throw;
  return 0;
}

or 

constexpr void f2() {
  throw;
}

Tested on ppc64le.
OK for trunk?

Thanks.

	PR c++/67371
	* constexpr.c (potential_constant_expression_1): Allow THROW_EXPR.

diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 1eacb8be9a44..34c503ab2bc4 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -4043,6 +4043,7 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
     case BREAK_STMT:
     case CONTINUE_STMT:
     case REQUIRES_EXPR:
+    case THROW_EXPR:
       return true;
 
     case AGGR_INIT_EXPR:
@@ -4324,7 +4325,6 @@ potential_constant_expression_1 (tree t, bool want_rval, bool strict,
     case VEC_NEW_EXPR:
     case DELETE_EXPR:
     case VEC_DELETE_EXPR:
-    case THROW_EXPR:
     case OMP_ATOMIC:
     case OMP_ATOMIC_READ:
     case OMP_ATOMIC_CAPTURE_OLD:
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C b/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C
new file mode 100644
index 000000000000..09a3e618f8a2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-throw.C
@@ -0,0 +1,17 @@
+// { dg-do compile { target c++14 } }
+constexpr void f() {
+  if (false)
+    throw;
+}
+
+constexpr int fun(int n) {
+  switch (n) {
+  case 0:
+    return 1;
+  default:
+    throw; // { dg-error "not a constant-expression" }
+  }
+}
+
+static_assert(fun(0), "");
+static_assert(fun(1), ""); // { dg-error "non-constant condition" }
-- 
Markus

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-08-29 18:05 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-28 12:25 [PATCH] Fix c++/67371 (issues with throw in constexpr) Markus Trippelsdorf
2015-08-29  3:44 ` Jason Merrill
2015-08-29 10:53   ` [PATCH v2] " Markus Trippelsdorf
2015-08-29 12:57     ` Markus Trippelsdorf
2015-08-29 13:20     ` Jason Merrill
2015-08-29 15:26       ` [PATCH v3] " Markus Trippelsdorf
2015-08-30  1:04         ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).