From 0fa7617d84da8b809b14e1e2ee67474526c62021 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 20 Apr 2020 11:45:06 -0600 Subject: [PATCH] Mark move constructors as "noexcept" I recently learned that move constructors generally should be marked "noexcept". This ensures that standard containers will move objects when possible, rather than copy them. This patch fixes the cases I could find. Note that implicitly-defined or defaulted move constructors will automatically do what you'd expect; that is, they are noexcept if all the members have noexcept move constructors. While doing this, I noticed a couple of odd cases where the move constructor seemed to assume that the object being constructed could have state requiring destruction. I've fixed these as well. See completion_result and scoped_mmap. gdb/ChangeLog 2020-04-20 Tom Tromey * python/python.c (struct gdbpy_event): Mark move constructor as noexcept. * python/py-tui.c (class gdbpy_tui_window_maker): Mark move constructor as noexcept. * completer.h (struct completion_result): Mark move constructor as noexcept. * completer.c (completion_result::completion_result): Use initialization style. Don't call reset_match_list. gdbsupport/ChangeLog 2020-04-20 Tom Tromey * scoped_mmap.h (scoped_mmap): Mark move constructor as noexcept. Use initialization style. Don't call destroy. * scoped_fd.h (class scoped_fd): Mark move constructor as noexcept. * gdb_ref_ptr.h (class ref_ptr): Mark move constructor as noexcept. --- gdb/ChangeLog | 11 +++++++++++ gdb/completer.c | 10 +++------- gdb/completer.h | 2 +- gdb/python/py-tui.c | 2 +- gdb/python/python.c | 2 +- gdbsupport/ChangeLog | 9 +++++++++ gdbsupport/gdb_ref_ptr.h | 2 +- gdbsupport/scoped_fd.h | 2 +- gdbsupport/scoped_mmap.h | 9 +++------ 9 files changed, 31 insertions(+), 18 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b023bfe4b2..aa99da0c4d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2020-04-20 Tom Tromey + + * python/python.c (struct gdbpy_event): Mark move constructor as + noexcept. + * python/py-tui.c (class gdbpy_tui_window_maker): Mark move + constructor as noexcept. + * completer.h (struct completion_result): Mark move constructor as + noexcept. + * completer.c (completion_result::completion_result): Use + initialization style. Don't call reset_match_list. + 2020-04-20 Mihails Strasuns * MAINTAINERS (Write After Approval): Add myself. diff --git a/gdb/completer.c b/gdb/completer.c index 0dd91a7195..f9631f43cf 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -2327,15 +2327,11 @@ completion_result::~completion_result () /* See completer.h */ -completion_result::completion_result (completion_result &&rhs) +completion_result::completion_result (completion_result &&rhs) noexcept + : match_list (rhs.match_list), + number_matches (rhs.number_matches) { - if (this == &rhs) - return; - - reset_match_list (); - match_list = rhs.match_list; rhs.match_list = NULL; - number_matches = rhs.number_matches; rhs.number_matches = 0; } diff --git a/gdb/completer.h b/gdb/completer.h index fd0d47b206..d3afa5fe3e 100644 --- a/gdb/completer.h +++ b/gdb/completer.h @@ -242,7 +242,7 @@ struct completion_result DISABLE_COPY_AND_ASSIGN (completion_result); /* Move a result. */ - completion_result (completion_result &&rhs); + completion_result (completion_result &&rhs) noexcept; /* Release ownership of the match list array. */ char **release_match_list (); diff --git a/gdb/python/py-tui.c b/gdb/python/py-tui.c index de7c396be9..ca88f85eb9 100644 --- a/gdb/python/py-tui.c +++ b/gdb/python/py-tui.c @@ -233,7 +233,7 @@ public: ~gdbpy_tui_window_maker (); - gdbpy_tui_window_maker (gdbpy_tui_window_maker &&other) + gdbpy_tui_window_maker (gdbpy_tui_window_maker &&other) noexcept : m_constr (std::move (other.m_constr)) { } diff --git a/gdb/python/python.c b/gdb/python/python.c index d65cca403b..4875ffd293 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -975,7 +975,7 @@ struct gdbpy_event { } - gdbpy_event (gdbpy_event &&other) + gdbpy_event (gdbpy_event &&other) noexcept : m_func (other.m_func) { other.m_func = nullptr; diff --git a/gdbsupport/ChangeLog b/gdbsupport/ChangeLog index cd7033d58d..78fbbe65c7 100644 --- a/gdbsupport/ChangeLog +++ b/gdbsupport/ChangeLog @@ -1,3 +1,12 @@ +2020-04-20 Tom Tromey + + * scoped_mmap.h (scoped_mmap): Mark move constructor as noexcept. + Use initialization style. Don't call destroy. + * scoped_fd.h (class scoped_fd): Mark move constructor as + noexcept. + * gdb_ref_ptr.h (class ref_ptr): Mark move constructor as + noexcept. + 2020-04-13 Tom Tromey * event-loop.c: Move comment. Remove obsolete comment. diff --git a/gdbsupport/gdb_ref_ptr.h b/gdbsupport/gdb_ref_ptr.h index c5ef13f3df..de387f598d 100644 --- a/gdbsupport/gdb_ref_ptr.h +++ b/gdbsupport/gdb_ref_ptr.h @@ -78,7 +78,7 @@ class ref_ptr } /* Transfer ownership from OTHER. */ - ref_ptr (ref_ptr &&other) + ref_ptr (ref_ptr &&other) noexcept : m_obj (other.m_obj) { other.m_obj = NULL; diff --git a/gdbsupport/scoped_fd.h b/gdbsupport/scoped_fd.h index f40ce8b0b5..ec654df524 100644 --- a/gdbsupport/scoped_fd.h +++ b/gdbsupport/scoped_fd.h @@ -30,7 +30,7 @@ class scoped_fd public: explicit scoped_fd (int fd = -1) noexcept : m_fd (fd) {} - scoped_fd (scoped_fd &&other) + scoped_fd (scoped_fd &&other) noexcept : m_fd (other.m_fd) { other.m_fd = -1; diff --git a/gdbsupport/scoped_mmap.h b/gdbsupport/scoped_mmap.h index bab988f364..9b74383fc5 100644 --- a/gdbsupport/scoped_mmap.h +++ b/gdbsupport/scoped_mmap.h @@ -42,13 +42,10 @@ public: destroy (); } - scoped_mmap (scoped_mmap &&rhs) + scoped_mmap (scoped_mmap &&rhs) noexcept + : m_mem (rhs.m_mem), + m_length (rhs.m_length) { - destroy (); - - m_mem = rhs.m_mem; - m_length = rhs.m_length; - rhs.m_mem = MAP_FAILED; rhs.m_length = 0; }