summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-06-16 14:43:20 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-06-16 14:43:20 +0000
commitaf96e5ab6f7a6db5bb92805a16849109b30cd40a (patch)
tree008d36677165ca97125bd44718c610d4e8d5a989
parent6860980ed5f7fc27d9b6282723a4c24a2c688b4b (diff)
downloadgcc-af96e5ab6f7a6db5bb92805a16849109b30cd40a.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@249264 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog19
-rw-r--r--gcc/cp/class.c6
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/cp/except.c12
-rw-r--r--gcc/cp/method.c2
6 files changed, 24 insertions, 18 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7bf7ed1865e..ff832f8f44d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index ebb46fbf38c..054dd3e26e7 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 11250737ccb..c56e59cbd7e 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 04418a19ddf..b6e85474182 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 ab7ab5db158..9e41ec451af 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 aa607d53346..98d36daa02c 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);