aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2019-04-12 15:29:03 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2019-04-12 15:29:03 +0000
commitc46f1a1791b3ec3a58780a4b882ecf19f047869a (patch)
tree5ebfaf92e50457cb04fa46ccb246df340415737b /gcc/cp
parentcc3bae3dc2819726e3d3903937e65f4f8d4f2fd5 (diff)
downloadgcc-c46f1a1791b3ec3a58780a4b882ecf19f047869a.zip
gcc-c46f1a1791b3ec3a58780a4b882ecf19f047869a.tar.gz
gcc-c46f1a1791b3ec3a58780a4b882ecf19f047869a.tar.bz2
PR c++/87603 - constexpr functions are no longer noexcept.
* constexpr.c (is_sub_constant_expr): Remove unused function. * cp-tree.h (is_sub_constant_expr): Remove declaration. * except.c (check_noexcept_r): Don't consider a call to a constexpr function noexcept. * g++.dg/cpp0x/constexpr-noexcept.C: Adjust the expected result. * g++.dg/cpp0x/constexpr-noexcept3.C: Likewise. * g++.dg/cpp0x/constexpr-noexcept4.C: Likewise. * g++.dg/cpp0x/constexpr-noexcept8.C: New test. * g++.dg/cpp0x/inh-ctor32.C: Remove dg-message. * g++.dg/cpp1y/constexpr-noexcept1.C: New test. From-SVN: r270320
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c21
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/except.c13
4 files changed, 14 insertions, 27 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9a12622..8e63fda 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -3,6 +3,12 @@
* except.c (build_noexcept_spec): Use build_converted_constant_bool_expr
instead of perform_implicit_conversion_flags.
+ PR c++/87603 - constexpr functions are no longer noexcept.
+ * constexpr.c (is_sub_constant_expr): Remove unused function.
+ * cp-tree.h (is_sub_constant_expr): Remove declaration.
+ * except.c (check_noexcept_r): Don't consider a call to a constexpr
+ function noexcept.
+
2019-04-11 Jakub Jelinek <jakub@redhat.com>
PR translation/90035
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 0ce5618..9c13f0d 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -5423,27 +5423,6 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
return r;
}
-/* Returns true if T is a valid subexpression of a constant expression,
- even if it isn't itself a constant expression. */
-
-bool
-is_sub_constant_expr (tree t)
-{
- bool non_constant_p = false;
- bool overflow_p = false;
- hash_map <tree, tree> map;
- HOST_WIDE_INT constexpr_ops_count = 0;
-
- constexpr_ctx ctx
- = { NULL, &map, NULL, NULL, NULL, NULL, &constexpr_ops_count,
- true, true, false };
-
- instantiate_constexpr_fns (t);
- cxx_eval_constant_expression (&ctx, t, false, &non_constant_p,
- &overflow_p);
- return !non_constant_p && !overflow_p;
-}
-
/* If T represents a constant expression returns its reduced value.
Otherwise return error_mark_node. If T is dependent, then
return NULL. */
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index b87b968..ff4ce06 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -7720,7 +7720,6 @@ extern tree fold_non_dependent_init (tree,
tsubst_flags_t = tf_warning_or_error,
bool = false);
extern tree fold_simple (tree);
-extern bool is_sub_constant_expr (tree);
extern bool reduced_constant_expression_p (tree);
extern bool is_instantiation_of_constexpr (tree);
extern bool var_in_constexpr_fn (tree);
diff --git a/gcc/cp/except.c b/gcc/cp/except.c
index 25ab869..afc2610 100644
--- a/gcc/cp/except.c
+++ b/gcc/cp/except.c
@@ -1128,11 +1128,14 @@ check_noexcept_r (tree *tp, int * /*walk_subtrees*/, void * /*data*/)
&& (DECL_ARTIFICIAL (fn)
|| nothrow_libfn_p (fn)))
return TREE_NOTHROW (fn) ? NULL_TREE : fn;
- /* A call to a constexpr function is noexcept if the call
- is a constant expression. */
- if (DECL_DECLARED_CONSTEXPR_P (fn)
- && is_sub_constant_expr (t))
- return NULL_TREE;
+ /* We used to treat a call to a constexpr function as noexcept if
+ the call was a constant expression (CWG 1129). This has changed
+ in P0003 whereby noexcept has no special rule for constant
+ expressions anymore. Since the current behavior is important for
+ certain library functionality, we treat this as a DR, therefore
+ adjusting the behavior for C++11 and C++14. Previously, we had
+ to evaluate the noexcept-specifier's operand here, but that could
+ cause instantiations that would fail. */
}
if (!TYPE_NOTHROW_P (type))
return fn;