mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-22 23:01:17 +08:00
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
This commit is contained in:
parent
091871eadd
commit
8f5a5a8ecd
@ -1,3 +1,10 @@
|
||||
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>
|
||||
|
||||
* semantics.c (sort_constexpr_mem_initializers): Tweak.
|
||||
|
@ -5066,6 +5066,7 @@ extern tree build_ptrmem_type (tree, tree);
|
||||
extern tree build_this_parm (tree, cp_cv_quals);
|
||||
extern int copy_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 void grok_special_member_properties (tree);
|
||||
extern int grok_ctor_properties (const_tree, const_tree);
|
||||
|
@ -10859,10 +10859,6 @@ copy_fn_p (const_tree d)
|
||||
bool
|
||||
move_fn_p (const_tree d)
|
||||
{
|
||||
tree args;
|
||||
tree arg_type;
|
||||
bool result = false;
|
||||
|
||||
gcc_assert (DECL_FUNCTION_MEMBER_P (d));
|
||||
|
||||
if (cxx_dialect == cxx98)
|
||||
@ -10872,12 +10868,29 @@ move_fn_p (const_tree d)
|
||||
if (TREE_CODE (d) == TEMPLATE_DECL
|
||||
|| (DECL_TEMPLATE_INFO (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
|
||||
represented as template functions internally, and we must
|
||||
accept those as copy functions. */
|
||||
accept those as move functions. */
|
||||
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);
|
||||
if (!args)
|
||||
return 0;
|
||||
|
@ -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=. */
|
||||
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;
|
||||
|
||||
if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn))
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR fortran/54208
|
||||
|
26
gcc/testsuite/g++.dg/cpp0x/implicit14.C
Normal file
26
gcc/testsuite/g++.dg/cpp0x/implicit14.C
Normal file
@ -0,0 +1,26 @@
|
||||
// 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();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user