Commit 0d1dc586 by Nathan Sidwell Committed by 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.

From-SVN: r249264
parent 6a2dfd9a
2017-06-16 Nathan Sidwell <nathan@acm.org> 2017-06-16 Nathan Sidwell <nathan@acm.org>
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 Make rtti lazier
* rtti.c (enum tinfo_kind): Add TK_DERIVED_TYPES, * rtti.c (enum tinfo_kind): Add TK_DERIVED_TYPES,
TK_VMI_CLASS_TYPES, TK_MAX. Delete TK_FIXED. TK_VMI_CLASS_TYPES, TK_MAX. Delete TK_FIXED.
......
...@@ -5025,10 +5025,8 @@ void ...@@ -5025,10 +5025,8 @@ void
deduce_noexcept_on_destructor (tree dtor) deduce_noexcept_on_destructor (tree dtor)
{ {
if (!TYPE_RAISES_EXCEPTIONS (TREE_TYPE (dtor))) if (!TYPE_RAISES_EXCEPTIONS (TREE_TYPE (dtor)))
{ TREE_TYPE (dtor) = build_exception_variant (TREE_TYPE (dtor),
tree eh_spec = unevaluated_noexcept_spec (); noexcept_deferred_spec);
TREE_TYPE (dtor) = build_exception_variant (TREE_TYPE (dtor), eh_spec);
}
} }
/* For each destructor in T, deduce noexcept: /* For each destructor in T, deduce noexcept:
......
...@@ -6317,7 +6317,6 @@ extern tree forward_parm (tree); ...@@ -6317,7 +6317,6 @@ extern tree forward_parm (tree);
extern bool is_trivially_xible (enum tree_code, tree, tree); extern bool is_trivially_xible (enum tree_code, tree, tree);
extern bool is_xible (enum tree_code, tree, tree); extern bool is_xible (enum tree_code, tree, tree);
extern tree get_defaulted_eh_spec (tree); extern tree get_defaulted_eh_spec (tree);
extern tree unevaluated_noexcept_spec (void);
extern void after_nsdmi_defaulted_late_checks (tree); extern void after_nsdmi_defaulted_late_checks (tree);
extern bool maybe_explain_implicit_delete (tree); extern bool maybe_explain_implicit_delete (tree);
extern void explain_implicit_non_constexpr (tree); extern void explain_implicit_non_constexpr (tree);
......
...@@ -4078,6 +4078,8 @@ cxx_init_decl_processing (void) ...@@ -4078,6 +4078,8 @@ cxx_init_decl_processing (void)
empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE); empty_except_spec = build_tree_list (NULL_TREE, NULL_TREE);
noexcept_true_spec = build_tree_list (boolean_true_node, 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_false_spec = build_tree_list (boolean_false_node, NULL_TREE);
noexcept_deferred_spec = build_tree_list (make_node (DEFERRED_NOEXCEPT),
NULL_TREE);
#if 0 #if 0
record_builtin_type (RID_MAX, NULL, string_type_node); record_builtin_type (RID_MAX, NULL, string_type_node);
......
...@@ -1197,18 +1197,6 @@ build_noexcept_spec (tree expr, int complain) ...@@ -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 /* 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 */ TRY and CATCH locations. CATCH_LIST must be a STATEMENT_LIST */
......
...@@ -2023,7 +2023,7 @@ implicitly_declare_fn (special_function_kind kind, tree type, ...@@ -2023,7 +2023,7 @@ implicitly_declare_fn (special_function_kind kind, tree type,
} }
else if (cxx_dialect >= cxx11) else if (cxx_dialect >= cxx11)
{ {
raises = unevaluated_noexcept_spec (); raises = noexcept_deferred_spec;
synthesized_method_walk (type, kind, const_p, NULL, &trivial_p, synthesized_method_walk (type, kind, const_p, NULL, &trivial_p,
&deleted_p, &constexpr_p, false, &deleted_p, &constexpr_p, false,
inherited_ctor, inherited_parms); inherited_ctor, inherited_parms);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment