Commit 8f5a5a8e by Jason Merrill Committed by Jason Merrill

re PR c++/54506 (Defaulted move constructors and move assignment operators are…

re PR c++/54506 (Defaulted move constructors and move assignment operators are erroneously defined as deleted)

	PR c++/54506
	* decl.c (move_signature_fn_p): Split out from move_fn_p.
	* method.c (process_subob_fn): Use it.
	* cp-tree.h: Declare it.

From-SVN: r191140
parent 091871ea
2012-09-10 Jason Merrill <jason@redhat.com>
PR c++/54506
* decl.c (move_signature_fn_p): Split out from move_fn_p.
* method.c (process_subob_fn): Use it.
* cp-tree.h: Declare it.
2012-09-07 Jason Merrill <jason@redhat.com> 2012-09-07 Jason Merrill <jason@redhat.com>
* semantics.c (sort_constexpr_mem_initializers): Tweak. * semantics.c (sort_constexpr_mem_initializers): Tweak.
......
...@@ -5066,6 +5066,7 @@ extern tree build_ptrmem_type (tree, tree); ...@@ -5066,6 +5066,7 @@ extern tree build_ptrmem_type (tree, tree);
extern tree build_this_parm (tree, cp_cv_quals); extern tree build_this_parm (tree, cp_cv_quals);
extern int copy_fn_p (const_tree); extern int copy_fn_p (const_tree);
extern bool move_fn_p (const_tree); extern bool move_fn_p (const_tree);
extern bool move_signature_fn_p (const_tree);
extern tree get_scope_of_declarator (const cp_declarator *); extern tree get_scope_of_declarator (const cp_declarator *);
extern void grok_special_member_properties (tree); extern void grok_special_member_properties (tree);
extern int grok_ctor_properties (const_tree, const_tree); extern int grok_ctor_properties (const_tree, const_tree);
......
...@@ -10859,10 +10859,6 @@ copy_fn_p (const_tree d) ...@@ -10859,10 +10859,6 @@ copy_fn_p (const_tree d)
bool bool
move_fn_p (const_tree d) move_fn_p (const_tree d)
{ {
tree args;
tree arg_type;
bool result = false;
gcc_assert (DECL_FUNCTION_MEMBER_P (d)); gcc_assert (DECL_FUNCTION_MEMBER_P (d));
if (cxx_dialect == cxx98) if (cxx_dialect == cxx98)
...@@ -10872,12 +10868,29 @@ move_fn_p (const_tree d) ...@@ -10872,12 +10868,29 @@ move_fn_p (const_tree d)
if (TREE_CODE (d) == TEMPLATE_DECL if (TREE_CODE (d) == TEMPLATE_DECL
|| (DECL_TEMPLATE_INFO (d) || (DECL_TEMPLATE_INFO (d)
&& DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d)))) && DECL_MEMBER_TEMPLATE_P (DECL_TI_TEMPLATE (d))))
/* Instantiations of template member functions are never copy /* Instantiations of template member functions are never move
functions. Note that member functions of templated classes are functions. Note that member functions of templated classes are
represented as template functions internally, and we must represented as template functions internally, and we must
accept those as copy functions. */ accept those as move functions. */
return 0; return 0;
return move_signature_fn_p (d);
}
/* D is a constructor or overloaded `operator='.
Then, this function returns true when D has the same signature as a move
constructor or move assignment operator (because either it is such a
ctor/op= or it is a template specialization with the same signature),
false otherwise. */
bool
move_signature_fn_p (const_tree d)
{
tree args;
tree arg_type;
bool result = false;
args = FUNCTION_FIRST_USER_PARMTYPE (d); args = FUNCTION_FIRST_USER_PARMTYPE (d);
if (!args) if (!args)
return 0; return 0;
......
...@@ -947,9 +947,10 @@ process_subob_fn (tree fn, bool move_p, tree *spec_p, bool *trivial_p, ...@@ -947,9 +947,10 @@ process_subob_fn (tree fn, bool move_p, tree *spec_p, bool *trivial_p,
} }
} }
/* Core 1402: A non-trivial copy op suppresses the implicit /* Core 1402: A non-trivial non-move ctor suppresses the implicit
declaration of the move ctor/op=. */ declaration of the move ctor/op=. */
if (no_implicit_p && move_p && !move_fn_p (fn) && !trivial_fn_p (fn)) if (no_implicit_p && move_p && !move_signature_fn_p (fn)
&& !trivial_fn_p (fn))
*no_implicit_p = true; *no_implicit_p = true;
if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn)) if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn))
......
2012-09-10 Jason Merrill <jason@redhat.com>
PR c++/54506
* g++.dg/cpp0x/implicit14.C: New.
2012-09-07 Mikael Morin <mikael@gcc.gnu.org> 2012-09-07 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54208 PR fortran/54208
......
// PR c++/54506
// { dg-do compile { target c++11 } }
template <class T>
struct A
{
A() {}
A(A const volatile &&) = delete;
A &operator =(A const volatile &&) = delete;
template <class U> A(A<U> &&) {}
template <class U> A &operator =(A<U> &&) { return *this; }
};
struct B
{
A<int> a;
B() = default;
};
int main()
{
B b = B();
b = B();
}
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