summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-17 15:57:59 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-17 15:57:59 +0000
commitcd77b36cdc71b4211f783bb353e03ee2656a50f8 (patch)
tree3c5ec1dc05587e8598c06b9f0124ce3a6f062e68
parent6f412e1ca542f89258a54f828e3f0fbbd3e8c8fc (diff)
downloadgcc-cd77b36cdc71b4211f783bb353e03ee2656a50f8.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250280 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/class.c48
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/cp/method.c12
-rw-r--r--gcc/cp/tree.c3
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 <nathan@acm.org>
+ * 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.... */;