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
This commit is contained in:
Nathan Sidwell 2017-07-17 15:57:59 +00:00 committed by Nathan Sidwell
parent aac595770c
commit 619018d4b9
5 changed files with 31 additions and 45 deletions

View file

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

View file

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

View file

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

View file

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

View file

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