From 0d1dc5862f978beb28c76b91b137ccc23f747498 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Fri, 16 Jun 2017 14:43:20 +0000 Subject: [PATCH] Don't defer noexcept_deferred_spec. * cp-tree.h (unevaluated_noexcept_spec): Don't declare. * decl.c (cxx_init_decl_processing): Initialize noexcept_deferred_spec. * except.c (unevaluated_noexcept_spec): Delete. * class.c (deduce_noexcept_on_destructor): Use noexcept_deferred_spec directly. * method.c (implicitly_declare_fn): Likewise. From-SVN: r249264 --- gcc/cp/ChangeLog | 19 +++++++++++++++++++ gcc/cp/class.c | 6 ++---- gcc/cp/cp-tree.h | 1 - gcc/cp/decl.c | 2 ++ gcc/cp/except.c | 12 ------------ gcc/cp/method.c | 2 +- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7bf7ed1..ff832f8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,24 @@ 2017-06-16 Nathan Sidwell + Don't defer noexcept_deferred_spec. + * cp-tree.h (unevaluated_noexcept_spec): Don't declare. + * decl.c (cxx_init_decl_processing): Initialize + noexcept_deferred_spec. + * except.c (unevaluated_noexcept_spec): Delete. + * class.c (deduce_noexcept_on_destructor): Use + noexcept_deferred_spec directly. + * method.c (implicitly_declare_fn): Likewise. + + Make keyed_classes a vector. + * cp-tree.h (CPTI_KEYED_CLASSES, keyed_classes): Delete. + (keyed_classes): Declare as vector. + * decl.c (keyed_classes): Define. + (cxx_init_decl_processing): Allocate it. + (record_key_method_defined): Use vec_safe_push. + * class.c (finish_struct_1): Likewise. + * pt.c (instantiate_class_template_1): Likewise. + * decl2.c (c_parse_final_cleanups): Reverse iterate keyed_classes. + Make rtti lazier * rtti.c (enum tinfo_kind): Add TK_DERIVED_TYPES, TK_VMI_CLASS_TYPES, TK_MAX. Delete TK_FIXED. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index ebb46fb..054dd3e 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5025,10 +5025,8 @@ void deduce_noexcept_on_destructor (tree dtor) { if (!TYPE_RAISES_EXCEPTIONS (TREE_TYPE (dtor))) - { - tree eh_spec = unevaluated_noexcept_spec (); - TREE_TYPE (dtor) = build_exception_variant (TREE_TYPE (dtor), eh_spec); - } + TREE_TYPE (dtor) = build_exception_variant (TREE_TYPE (dtor), + noexcept_deferred_spec); } /* For each destructor in T, deduce noexcept: diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 1125073..c56e59c 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6317,7 +6317,6 @@ extern tree forward_parm (tree); extern bool is_trivially_xible (enum tree_code, tree, tree); extern bool is_xible (enum tree_code, tree, tree); extern tree get_defaulted_eh_spec (tree); -extern tree unevaluated_noexcept_spec (void); extern void after_nsdmi_defaulted_late_checks (tree); extern bool maybe_explain_implicit_delete (tree); extern void explain_implicit_non_constexpr (tree); diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 04418a1..b6e8547 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4078,6 +4078,8 @@ cxx_init_decl_processing (void) empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); noexcept_true_spec = build_tree_list (boolean_true_node, NULL_TREE); noexcept_false_spec = build_tree_list (boolean_false_node, NULL_TREE); + noexcept_deferred_spec = build_tree_list (make_node (DEFERRED_NOEXCEPT), + NULL_TREE); #if 0 record_builtin_type (RID_MAX, NULL, string_type_node); diff --git a/gcc/cp/except.c b/gcc/cp/except.c index ab7ab5d..9e41ec4 100644 --- a/gcc/cp/except.c +++ b/gcc/cp/except.c @@ -1197,18 +1197,6 @@ build_noexcept_spec (tree expr, int complain) } } -/* Returns a noexcept-specifier to be evaluated later, for an - implicitly-declared or explicitly defaulted special member function. */ - -tree -unevaluated_noexcept_spec (void) -{ - if (!noexcept_deferred_spec) - noexcept_deferred_spec - = build_noexcept_spec (make_node (DEFERRED_NOEXCEPT), tf_none); - return noexcept_deferred_spec; -} - /* Returns a TRY_CATCH_EXPR that will put TRY_LIST and CATCH_LIST in the TRY and CATCH locations. CATCH_LIST must be a STATEMENT_LIST */ diff --git a/gcc/cp/method.c b/gcc/cp/method.c index aa607d5..98d36da 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -2023,7 +2023,7 @@ implicitly_declare_fn (special_function_kind kind, tree type, } else if (cxx_dialect >= cxx11) { - raises = unevaluated_noexcept_spec (); + raises = noexcept_deferred_spec; synthesized_method_walk (type, kind, const_p, NULL, &trivial_p, &deleted_p, &constexpr_p, false, inherited_ctor, inherited_parms); -- 2.7.4