Commit 830dea94 by Jason Merrill Committed by Jason Merrill

class.c (add_implicitly_declared_members): Update move conditions.

	N3203
	* class.c (add_implicitly_declared_members): Update move
	conditions.

From-SVN: r181445
parent a8e23778
2011-11-17 Jason Merrill <jason@redhat.com> 2011-11-17 Jason Merrill <jason@redhat.com>
N3203
* class.c (add_implicitly_declared_members): Update move
conditions.
PR c++/51137 PR c++/51137
* class.c (build_base_path): Don't do calculation in templates. * class.c (build_base_path): Don't do calculation in templates.
......
...@@ -2721,6 +2721,13 @@ add_implicitly_declared_members (tree t, ...@@ -2721,6 +2721,13 @@ add_implicitly_declared_members (tree t,
int cant_have_const_cctor, int cant_have_const_cctor,
int cant_have_const_assignment) int cant_have_const_assignment)
{ {
bool move_ok = false;
if (cxx_dialect >= cxx0x && !CLASSTYPE_DESTRUCTORS (t)
&& !TYPE_HAS_COPY_CTOR (t) && !TYPE_HAS_COPY_ASSIGN (t)
&& !type_has_move_constructor (t) && !type_has_move_assign (t))
move_ok = true;
/* Destructor. */ /* Destructor. */
if (!CLASSTYPE_DESTRUCTORS (t)) if (!CLASSTYPE_DESTRUCTORS (t))
{ {
...@@ -2758,7 +2765,7 @@ add_implicitly_declared_members (tree t, ...@@ -2758,7 +2765,7 @@ add_implicitly_declared_members (tree t,
TYPE_HAS_COPY_CTOR (t) = 1; TYPE_HAS_COPY_CTOR (t) = 1;
TYPE_HAS_CONST_COPY_CTOR (t) = !cant_have_const_cctor; TYPE_HAS_CONST_COPY_CTOR (t) = !cant_have_const_cctor;
CLASSTYPE_LAZY_COPY_CTOR (t) = 1; CLASSTYPE_LAZY_COPY_CTOR (t) = 1;
if (cxx_dialect >= cxx0x && !type_has_move_constructor (t)) if (move_ok)
CLASSTYPE_LAZY_MOVE_CTOR (t) = 1; CLASSTYPE_LAZY_MOVE_CTOR (t) = 1;
} }
...@@ -2771,7 +2778,7 @@ add_implicitly_declared_members (tree t, ...@@ -2771,7 +2778,7 @@ add_implicitly_declared_members (tree t,
TYPE_HAS_COPY_ASSIGN (t) = 1; TYPE_HAS_COPY_ASSIGN (t) = 1;
TYPE_HAS_CONST_COPY_ASSIGN (t) = !cant_have_const_assignment; TYPE_HAS_CONST_COPY_ASSIGN (t) = !cant_have_const_assignment;
CLASSTYPE_LAZY_COPY_ASSIGN (t) = 1; CLASSTYPE_LAZY_COPY_ASSIGN (t) = 1;
if (cxx_dialect >= cxx0x && !type_has_move_assign (t)) if (move_ok)
CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 1; CLASSTYPE_LAZY_MOVE_ASSIGN (t) = 1;
} }
......
2011-11-17 Jason Merrill <jason@redhat.com>
* testsuite/21_strings/basic_string/cons/char/moveable2.cc
(tstring): Add defaulted move assignment.
* testsuite/21_strings/basic_string/cons/wchar_t/moveable2.cc
(tstring): Add defaulted move assignment.
* testsuite/util/testsuite_tr1.h (NoexceptMoveConsClass): Add
defaulted move assignment operator.
(NoexceptMoveAssignClass): Add defaulted move constructor.
2011-11-17 Jonathan Wakely <jwakely.gcc@gmail.com> 2011-11-17 Jonathan Wakely <jwakely.gcc@gmail.com>
* doc/xml/manual/status_cxx2011.xml: Status of piecewise construction * doc/xml/manual/status_cxx2011.xml: Status of piecewise construction
......
...@@ -31,6 +31,7 @@ class tstring : public std::basic_string<char> ...@@ -31,6 +31,7 @@ class tstring : public std::basic_string<char>
public: public:
tstring() : std::basic_string<char>() {} tstring() : std::basic_string<char>() {}
tstring(tstring&& s) : std::basic_string<char>(std::move(s)) {} tstring(tstring&& s) : std::basic_string<char>(std::move(s)) {}
tstring& operator=(tstring&& s) = default;
}; };
void test01() void test01()
......
...@@ -31,6 +31,7 @@ class twstring : public std::basic_string<wchar_t> ...@@ -31,6 +31,7 @@ class twstring : public std::basic_string<wchar_t>
public: public:
twstring() : std::basic_string<wchar_t>() {} twstring() : std::basic_string<wchar_t>() {}
twstring(twstring&& s) : std::basic_string<wchar_t>(std::move(s)) {} twstring(twstring&& s) : std::basic_string<wchar_t>(std::move(s)) {}
twstring& operator=(twstring&&) = default;
}; };
void test01() void test01()
......
...@@ -199,6 +199,7 @@ namespace __gnu_test ...@@ -199,6 +199,7 @@ namespace __gnu_test
struct NoexceptMoveConsClass struct NoexceptMoveConsClass
{ {
NoexceptMoveConsClass(NoexceptMoveConsClass&&) noexcept(true); NoexceptMoveConsClass(NoexceptMoveConsClass&&) noexcept(true);
NoexceptMoveConsClass& operator=(NoexceptMoveConsClass&&) = default;
}; };
struct ExceptMoveConsClass struct ExceptMoveConsClass
...@@ -220,6 +221,7 @@ namespace __gnu_test ...@@ -220,6 +221,7 @@ namespace __gnu_test
struct NoexceptMoveAssignClass struct NoexceptMoveAssignClass
{ {
NoexceptMoveAssignClass(NoexceptMoveAssignClass&&) = default;
NoexceptMoveAssignClass& NoexceptMoveAssignClass&
operator=(NoexceptMoveAssignClass&&) noexcept(true); operator=(NoexceptMoveAssignClass&&) noexcept(true);
}; };
......
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