Commit 619018d4 by Nathan Sidwell Committed by Nathan Sidwell

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
parent aac59577
2017-07-17 Nathan Sidwell <nathan@acm.org> 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.c (classtype_has_nothrow_assign_or_copy_p): Clarify
semantics, simplify implementation. semantics, simplify implementation.
......
...@@ -5491,47 +5491,29 @@ type_has_move_assign (tree t) ...@@ -5491,47 +5491,29 @@ type_has_move_assign (tree t)
return false; return false;
} }
/* Returns true iff class T has a move constructor that was explicitly /* Returns true iff T, a class, has a user-declared move-assignment or
declared in the class body. Note that this is different from move-constructor. Note that this is different from
"user-provided", which doesn't include functions that are defaulted in "user-provided", which doesn't include functions that are defaulted
the class. */ in the class. */
bool 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)) if (!CLASSTYPE_METHOD_VEC (t))
return false; return false;
for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter) if (!CLASSTYPE_LAZY_MOVE_CTOR (t))
{ for (ovl_iterator iter (lookup_fnfields_slot_nolazy (t, ctor_identifier));
tree fn = *iter; iter; ++iter)
if (move_fn_p (fn) && !DECL_ARTIFICIAL (fn)) if (!DECL_ARTIFICIAL (*iter) && move_fn_p (*iter))
return true; 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;
if (!CLASSTYPE_LAZY_MOVE_ASSIGN (t))
for (ovl_iterator iter (lookup_fnfields_slot_nolazy for (ovl_iterator iter (lookup_fnfields_slot_nolazy
(t, cp_assignment_operator_id (NOP_EXPR))); (t, cp_assignment_operator_id (NOP_EXPR)));
iter; ++iter) iter; ++iter)
{ if (!DECL_ARTIFICIAL (*iter) && move_fn_p (*iter))
tree fn = *iter;
if (move_fn_p (fn) && !DECL_ARTIFICIAL (fn))
return true; return true;
}
return false; return false;
} }
......
...@@ -6025,8 +6025,7 @@ extern bool type_has_constexpr_default_constructor (tree); ...@@ -6025,8 +6025,7 @@ extern bool type_has_constexpr_default_constructor (tree);
extern bool type_has_virtual_destructor (tree); extern bool type_has_virtual_destructor (tree);
extern bool type_has_move_constructor (tree); extern bool type_has_move_constructor (tree);
extern bool type_has_move_assign (tree); extern bool type_has_move_assign (tree);
extern bool type_has_user_declared_move_constructor (tree); extern bool classtype_has_user_move_assign_or_move_ctor_p (tree);
extern bool type_has_user_declared_move_assign(tree);
extern bool type_build_ctor_call (tree); extern bool type_build_ctor_call (tree);
extern bool type_build_dtor_call (tree); extern bool type_build_dtor_call (tree);
extern void explain_non_literal_class (tree); extern void explain_non_literal_class (tree);
......
...@@ -1808,10 +1808,8 @@ maybe_explain_implicit_delete (tree decl) ...@@ -1808,10 +1808,8 @@ maybe_explain_implicit_delete (tree decl)
informed = false; informed = false;
} }
else if (DECL_ARTIFICIAL (decl) else if (DECL_ARTIFICIAL (decl)
&& (sfk == sfk_copy_assignment && (sfk == sfk_copy_assignment || sfk == sfk_copy_constructor)
|| sfk == sfk_copy_constructor) && classtype_has_user_move_assign_or_move_ctor_p (ctype))
&& (type_has_user_declared_move_constructor (ctype)
|| type_has_user_declared_move_assign (ctype)))
{ {
inform (DECL_SOURCE_LOCATION (decl), inform (DECL_SOURCE_LOCATION (decl),
"%q#D is implicitly declared as deleted because %qT " "%q#D is implicitly declared as deleted because %qT "
...@@ -2372,10 +2370,8 @@ lazily_declare_fn (special_function_kind sfk, tree type) ...@@ -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 /* [class.copy]/8 If the class definition declares a move constructor or
move assignment operator, the implicitly declared copy constructor is move assignment operator, the implicitly declared copy constructor is
defined as deleted.... */ defined as deleted.... */
if ((sfk == sfk_copy_assignment if ((sfk == sfk_copy_assignment || sfk == sfk_copy_constructor)
|| sfk == sfk_copy_constructor) && classtype_has_user_move_assign_or_move_ctor_p (type))
&& (type_has_user_declared_move_constructor (type)
|| type_has_user_declared_move_assign (type)))
DECL_DELETED_FN (fn) = true; DECL_DELETED_FN (fn) = true;
/* A destructor may be virtual. */ /* A destructor may be virtual. */
......
...@@ -3976,8 +3976,7 @@ type_has_nontrivial_copy_init (const_tree type) ...@@ -3976,8 +3976,7 @@ type_has_nontrivial_copy_init (const_tree type)
else if (CLASSTYPE_LAZY_COPY_CTOR (t)) else if (CLASSTYPE_LAZY_COPY_CTOR (t))
{ {
saw_copy = true; saw_copy = true;
if (type_has_user_declared_move_constructor (t) if (classtype_has_user_move_assign_or_move_ctor_p (t))
|| type_has_user_declared_move_assign (t))
/* [class.copy]/8 If the class definition declares a move /* [class.copy]/8 If the class definition declares a move
constructor or move assignment operator, the implicitly declared constructor or move assignment operator, the implicitly declared
copy constructor is defined as deleted.... */; copy constructor is defined as deleted.... */;
......
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