From 619018d4b9c3458e2d4aadfa42d30f5cd429f155 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 17 Jul 2017 15:57:59 +0000 Subject: [PATCH] class.c (type_has_user_declared_move_constructor, [...]): Combine into ... * class.c (type_has_user_declared_move_constructor, type_has_user_declared_move_assign): Combine into ... (classtype_has_user_move_assign_or_move_ctor_p): ... this new function. * cp-tree.h (type_has_user_declared_move_constructor, type_has_user_declared_move_assign): Combine into ... (classtype_has_user_move_assign_or_move_ctor_p): ... this. Declare. * method.c (maybe_explain_implicit_delete): Use it. (lazily_declare_fn): Use it. * tree.c (type_has_nontrivial_copy_init): Use it. From-SVN: r250280 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/class.c | 48 +++++++++++++++--------------------------------- gcc/cp/cp-tree.h | 3 +-- gcc/cp/method.c | 12 ++++-------- gcc/cp/tree.c | 3 +-- 5 files changed, 31 insertions(+), 45 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ecffbcdde56..acf179b0c84 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,15 @@ 2017-07-17 Nathan Sidwell + * class.c (type_has_user_declared_move_constructor, + type_has_user_declared_move_assign): Combine into ... + (classtype_has_user_move_assign_or_move_ctor_p): ... this new function. + * cp-tree.h (type_has_user_declared_move_constructor, + type_has_user_declared_move_assign): Combine into ... + (classtype_has_user_move_assign_or_move_ctor_p): ... this. Declare. + * method.c (maybe_explain_implicit_delete): Use it. + (lazily_declare_fn): Use it. + * tree.c (type_has_nontrivial_copy_init): Use it. + * semantics.c (classtype_has_nothrow_assign_or_copy_p): Clarify semantics, simplify implementation. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 0dca90575c7..b2175864e52 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5491,48 +5491,30 @@ type_has_move_assign (tree t) return false; } -/* Returns true iff class T has a move constructor that was explicitly - declared in the class body. Note that this is different from - "user-provided", which doesn't include functions that are defaulted in - the class. */ +/* Returns true iff T, a class, has a user-declared move-assignment or + move-constructor. Note that this is different from + "user-provided", which doesn't include functions that are defaulted + in the class. */ bool -type_has_user_declared_move_constructor (tree t) +classtype_has_user_move_assign_or_move_ctor_p (tree t) { - if (CLASSTYPE_LAZY_MOVE_CTOR (t)) - return false; - if (!CLASSTYPE_METHOD_VEC (t)) return false; - for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter) - { - tree fn = *iter; - if (move_fn_p (fn) && !DECL_ARTIFICIAL (fn)) + if (!CLASSTYPE_LAZY_MOVE_CTOR (t)) + for (ovl_iterator iter (lookup_fnfields_slot_nolazy (t, ctor_identifier)); + iter; ++iter) + if (!DECL_ARTIFICIAL (*iter) && move_fn_p (*iter)) return true; - } - - return false; -} - -/* Returns true iff class T has a move assignment operator that was - explicitly declared in the class body. */ - -bool -type_has_user_declared_move_assign (tree t) -{ - if (CLASSTYPE_LAZY_MOVE_ASSIGN (t)) - return false; - for (ovl_iterator iter (lookup_fnfields_slot_nolazy - (t, cp_assignment_operator_id (NOP_EXPR))); - iter; ++iter) - { - tree fn = *iter; - if (move_fn_p (fn) && !DECL_ARTIFICIAL (fn)) + if (!CLASSTYPE_LAZY_MOVE_ASSIGN (t)) + for (ovl_iterator iter (lookup_fnfields_slot_nolazy + (t, cp_assignment_operator_id (NOP_EXPR))); + iter; ++iter) + if (!DECL_ARTIFICIAL (*iter) && move_fn_p (*iter)) return true; - } - + return false; } diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 665ec034d0c..0da8a5c59b7 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -6025,8 +6025,7 @@ extern bool type_has_constexpr_default_constructor (tree); extern bool type_has_virtual_destructor (tree); extern bool type_has_move_constructor (tree); extern bool type_has_move_assign (tree); -extern bool type_has_user_declared_move_constructor (tree); -extern bool type_has_user_declared_move_assign(tree); +extern bool classtype_has_user_move_assign_or_move_ctor_p (tree); extern bool type_build_ctor_call (tree); extern bool type_build_dtor_call (tree); extern void explain_non_literal_class (tree); diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 0a4a9540622..1dfa1867e71 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1808,10 +1808,8 @@ maybe_explain_implicit_delete (tree decl) informed = false; } else if (DECL_ARTIFICIAL (decl) - && (sfk == sfk_copy_assignment - || sfk == sfk_copy_constructor) - && (type_has_user_declared_move_constructor (ctype) - || type_has_user_declared_move_assign (ctype))) + && (sfk == sfk_copy_assignment || sfk == sfk_copy_constructor) + && classtype_has_user_move_assign_or_move_ctor_p (ctype)) { inform (DECL_SOURCE_LOCATION (decl), "%q#D is implicitly declared as deleted because %qT " @@ -2372,10 +2370,8 @@ lazily_declare_fn (special_function_kind sfk, tree type) /* [class.copy]/8 If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted.... */ - if ((sfk == sfk_copy_assignment - || sfk == sfk_copy_constructor) - && (type_has_user_declared_move_constructor (type) - || type_has_user_declared_move_assign (type))) + if ((sfk == sfk_copy_assignment || sfk == sfk_copy_constructor) + && classtype_has_user_move_assign_or_move_ctor_p (type)) DECL_DELETED_FN (fn) = true; /* A destructor may be virtual. */ diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index c037b2c7440..64d4b286be6 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -3976,8 +3976,7 @@ type_has_nontrivial_copy_init (const_tree type) else if (CLASSTYPE_LAZY_COPY_CTOR (t)) { saw_copy = true; - if (type_has_user_declared_move_constructor (t) - || type_has_user_declared_move_assign (t)) + if (classtype_has_user_move_assign_or_move_ctor_p (t)) /* [class.copy]/8 If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted.... */; -- 2.30.2