diff options
author | Marek Polacek <polacek@redhat.com> | 2019-04-12 15:29:03 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2019-04-12 15:29:03 +0000 |
commit | c46f1a1791b3ec3a58780a4b882ecf19f047869a (patch) | |
tree | 5ebfaf92e50457cb04fa46ccb246df340415737b /gcc/cp | |
parent | cc3bae3dc2819726e3d3903937e65f4f8d4f2fd5 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 21 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/except.c | 13 |
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; |