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
This commit is contained in:
Nathan Sidwell 2017-06-16 14:43:20 +00:00 committed by Nathan Sidwell
parent 6a2dfd9a66
commit 0d1dc5862f
6 changed files with 24 additions and 18 deletions

View file

@ -1,5 +1,24 @@
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
* rtti.c (enum tinfo_kind): Add TK_DERIVED_TYPES,
TK_VMI_CLASS_TYPES, TK_MAX. Delete TK_FIXED.

View file

@ -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:

View file

@ -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);

View file

@ -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);

View file

@ -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 */

View file

@ -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);