Add noexcept specification for move ctor, move assignment, dtor in fbstring
authorTudor Bosman <tudorb@fb.com>
Tue, 24 Sep 2013 23:49:24 +0000 (16:49 -0700)
committerPeter Griess <pgriess@fb.com>
Tue, 15 Oct 2013 01:43:28 +0000 (18:43 -0700)
Test Plan: fbstring_test, test added

Reviewed By: ngbronson@fb.com

FB internal diff: D983278

folly/FBString.h
folly/test/FBStringTest.cpp

index e19943ab837ada34102153d9e8a4910c0e3bc0d9..c99bb4ad6cd1c85c51dd27ead16927f069601347 100644 (file)
@@ -305,7 +305,7 @@ private:
  */
 template <class Char> class fbstring_core {
 public:
-  fbstring_core() {
+  fbstring_core() noexcept {
     // Only initialize the tag, will set the MSBs (i.e. the small
     // string size) to zero too
     ml_.capacity_ = maxSmallSize << (8 * (sizeof(size_t) - sizeof(Char)));
@@ -359,7 +359,7 @@ public:
     assert(memcmp(data(), rhs.data(), size() * sizeof(Char)) == 0);
   }
 
-  fbstring_core(fbstring_core&& goner) {
+  fbstring_core(fbstring_core&& goner) noexcept {
     if (goner.category() == isSmall) {
       // Just copy, leave the goner in peace
       new(this) fbstring_core(goner.small_, goner.smallSize());
@@ -428,7 +428,7 @@ public:
     assert(memcmp(this->data(), data, size * sizeof(Char)) == 0);
   }
 
-  ~fbstring_core() {
+  ~fbstring_core() noexcept {
     auto const c = category();
     if (c == isSmall) {
       return;
@@ -1014,7 +1014,7 @@ private:
 
 public:
   // C++11 21.4.2 construct/copy/destroy
-  explicit basic_fbstring(const A& a = A()) {
+  explicit basic_fbstring(const A& a = A()) noexcept {
   }
 
   basic_fbstring(const basic_fbstring& str)
@@ -1022,7 +1022,8 @@ public:
   }
 
   // Move constructor
-  basic_fbstring(basic_fbstring&& goner) : store_(std::move(goner.store_)) {
+  basic_fbstring(basic_fbstring&& goner) noexcept
+      : store_(std::move(goner.store_)) {
   }
 
 #ifndef _LIBSTDCXX_FBSTRING
@@ -1080,7 +1081,7 @@ public:
     assign(il.begin(), il.end());
   }
 
-  ~basic_fbstring() {
+  ~basic_fbstring() noexcept {
   }
 
   basic_fbstring& operator=(const basic_fbstring& lhs) {
@@ -1106,7 +1107,7 @@ public:
   }
 
   // Move assignment
-  basic_fbstring& operator=(basic_fbstring&& goner) {
+  basic_fbstring& operator=(basic_fbstring&& goner) noexcept {
     if (FBSTRING_UNLIKELY(&goner == this)) {
       // Compatibility with std::basic_string<>,
       // C++11 21.4.2 [string.cons] / 23 requires self-move-assignment support.
index ede69e6a26393a65b09321b48b80796536849daa..36c8fe559cd9f76f2946044c47189c64e242cc6e 100644 (file)
@@ -30,6 +30,7 @@
 #include <gflags/gflags.h>
 
 #include "folly/Foreach.h"
+#include "folly/Portability.h"
 #include "folly/Random.h"
 #include "folly/Conv.h"
 
@@ -1162,6 +1163,19 @@ TEST(FBString, testFrontBack) {
   EXPECT_EQ(str, "HellO");
 }
 
+TEST(FBString, noexcept) {
+  EXPECT_TRUE(noexcept(fbstring()));
+  // std::move is not marked noexcept in gcc 4.6, sigh
+#if __GNUC_PREREQ(4, 7)
+  fbstring x;
+  EXPECT_FALSE(noexcept(fbstring(x)));
+  EXPECT_TRUE(noexcept(fbstring(std::move(x))));
+  fbstring y;
+  EXPECT_FALSE(noexcept(y = x));
+  EXPECT_TRUE(noexcept(y = std::move(x)));
+#endif
+}
+
 int main(int argc, char** argv) {
   testing::InitGoogleTest(&argc, argv);
   google::ParseCommandLineFlags(&argc, &argv, true);