summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjell.ahlstedt@bredband.net>2015-11-08 10:03:28 +0100
committerKjell Ahlstedt <kjell.ahlstedt@bredband.net>2015-11-08 10:03:28 +0100
commitb53b58b7816c20b3d09f1a6fa6ce98da1f003edf (patch)
tree391af9111fb331f64de9a24bc3a151ebbfb4c8b5
parent1ad7f93386aed6afab67249413c8ebef05882b67 (diff)
downloadsigc++-b53b58b7816c20b3d09f1a6fa6ce98da1f003edf.tar.gz
trackable, slot, signal: Remove noexcept specifications
* sigc++/functors/macros/slot.h.m4: * sigc++/functors/slot_base.[h|cc]: * sigc++/signal_base.[h|cc]: * sigc++/trackable.[h|cc]: Remove noexcept from the move operators. Bug #756484.
-rw-r--r--sigc++/functors/macros/slot.h.m44
-rw-r--r--sigc++/functors/slot_base.cc4
-rw-r--r--sigc++/functors/slot_base.h8
-rw-r--r--sigc++/signal_base.cc4
-rw-r--r--sigc++/signal_base.h4
-rw-r--r--sigc++/trackable.cc4
-rw-r--r--sigc++/trackable.h9
7 files changed, 23 insertions, 14 deletions
diff --git a/sigc++/functors/macros/slot.h.m4 b/sigc++/functors/macros/slot.h.m4
index 0a141a2..4e9b00f 100644
--- a/sigc++/functors/macros/slot.h.m4
+++ b/sigc++/functors/macros/slot.h.m4
@@ -91,7 +91,7 @@ FOR(1, $1,[
* If @p src is connected to a parent (e.g. a signal), it is copied, not moved.
* @param src The existing slot to move or copy.
*/
- slot$1(slot$1&& src) noexcept
+ slot$1(slot$1&& src)
: slot_base(std::move(src))
{}
@@ -110,7 +110,7 @@ FOR(1, $1,[
* @param src The slot from which to move or copy.
* @return @p this.
*/
- slot$1& operator=(slot$1&& src) noexcept
+ slot$1& operator=(slot$1&& src)
{
slot_base::operator=(std::move(src));
return *this;
diff --git a/sigc++/functors/slot_base.cc b/sigc++/functors/slot_base.cc
index 7500d84..9340b02 100644
--- a/sigc++/functors/slot_base.cc
+++ b/sigc++/functors/slot_base.cc
@@ -124,7 +124,7 @@ slot_base::slot_base(const slot_base& src)
}
}
-slot_base::slot_base(slot_base&& src) noexcept
+slot_base::slot_base(slot_base&& src)
: rep_(nullptr),
blocked_(src.blocked_)
{
@@ -219,7 +219,7 @@ slot_base& slot_base::operator=(const slot_base& src)
return *this;
}
-slot_base& slot_base::operator=(slot_base&& src) noexcept
+slot_base& slot_base::operator=(slot_base&& src)
{
if (src.rep_ == rep_)
{
diff --git a/sigc++/functors/slot_base.h b/sigc++/functors/slot_base.h
index ec7679a..6577574 100644
--- a/sigc++/functors/slot_base.h
+++ b/sigc++/functors/slot_base.h
@@ -244,6 +244,10 @@ class SIGC_API slot_base : public functor_base
{
typedef internal::slot_rep rep_type;
+ // Move operations are not declared noexcept because
+ // 1. they may copy instead of move
+ // 2. when they don't copy, they call src.rep_->notify_callbacks(), which
+ // may throw an exception.
public:
/// Constructs an empty slot.
slot_base();
@@ -262,7 +266,7 @@ public:
* If @p src is connected to a parent (e.g. a signal), it is copied, not moved.
* @param src The existing slot to move or copy.
*/
- slot_base(slot_base&& src) noexcept;
+ slot_base(slot_base&& src);
~slot_base();
@@ -344,7 +348,7 @@ public:
* @param src The slot from which to move or copy.
* @return @p this.
*/
- slot_base& operator=(slot_base&& src) noexcept;
+ slot_base& operator=(slot_base&& src);
public: // public to avoid template friend declarations
/** Typed slot_rep object that contains a functor. */
diff --git a/sigc++/signal_base.cc b/sigc++/signal_base.cc
index 64226b8..7885a53 100644
--- a/sigc++/signal_base.cc
+++ b/sigc++/signal_base.cc
@@ -167,7 +167,7 @@ signal_base::signal_base(const signal_base& src)
impl_->reference();
}
-signal_base::signal_base(signal_base&& src) noexcept
+signal_base::signal_base(signal_base&& src)
: trackable(std::move(src)),
impl_(std::move(src.impl_))
{
@@ -248,7 +248,7 @@ signal_base& signal_base::operator=(const signal_base& src)
return *this;
}
-signal_base& signal_base::operator=(signal_base&& src) noexcept
+signal_base& signal_base::operator=(signal_base&& src)
{
if (src.impl_ == impl_) return *this;
diff --git a/sigc++/signal_base.h b/sigc++/signal_base.h
index 1842b02..03ae156 100644
--- a/sigc++/signal_base.h
+++ b/sigc++/signal_base.h
@@ -290,13 +290,13 @@ struct SIGC_API signal_base : public trackable
signal_base(const signal_base& src);
- signal_base(signal_base&& src) noexcept;
+ signal_base(signal_base&& src);
~signal_base();
signal_base& operator=(const signal_base& src);
- signal_base& operator=(signal_base&& src) noexcept;
+ signal_base& operator=(signal_base&& src);
/** Returns whether the list of slots is empty.
* @return @p true if the list of slots is empty.
diff --git a/sigc++/trackable.cc b/sigc++/trackable.cc
index 385f97c..9faabc1 100644
--- a/sigc++/trackable.cc
+++ b/sigc++/trackable.cc
@@ -43,7 +43,7 @@ trackable::trackable(const trackable& /*src*/)
//
// If trackable's move constructor is modified, check if Glib::Object's
// move constructor should be modified similarly.
-trackable::trackable(trackable&& src) noexcept
+trackable::trackable(trackable&& src)
: callback_list_(nullptr)
{
src.notify_callbacks();
@@ -57,7 +57,7 @@ trackable& trackable::operator=(const trackable& src)
return *this;
}
-trackable& trackable::operator=(trackable&& src) noexcept
+trackable& trackable::operator=(trackable&& src)
{
if(this != &src)
{
diff --git a/sigc++/trackable.h b/sigc++/trackable.h
index af8042a..b82bbbb 100644
--- a/sigc++/trackable.h
+++ b/sigc++/trackable.h
@@ -108,15 +108,20 @@ private:
*/
struct SIGC_API trackable
{
+ // Concerning noexcept specifications:
+ // libsigc++ does not have complete control of what happens when notify_callbacks()
+ // is called. It may throw an exception. A method that calls notify_callbacks()
+ // shall not be declared noexcept.
+
trackable();
trackable(const trackable& src);
- trackable(trackable&& src) noexcept;
+ trackable(trackable&& src);
trackable& operator=(const trackable& src);
- trackable& operator=(trackable&& src) noexcept;
+ trackable& operator=(trackable&& src);
~trackable();