Allow building with -Wmissing-noreturn
authorChristopher Dykes <cdykes@fb.com>
Wed, 14 Dec 2016 06:05:21 +0000 (22:05 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Wed, 14 Dec 2016 06:17:58 +0000 (22:17 -0800)
Summary: If your function doesn't return you should be explicit about it.

Reviewed By: meyering

Differential Revision: D4309893

fbshipit-source-id: ce275ec8f42e2cb3253a1e40e263934649f09d9e

17 files changed:
folly/FixedString.h
folly/MallctlHelper.cpp
folly/MallctlHelper.h
folly/detail/ThreadLocalDetail.h
folly/experimental/DynamicParser.cpp
folly/experimental/DynamicParser.h
folly/experimental/exception_tracer/ExceptionTracerTest.cpp
folly/experimental/exception_tracer/test/ExceptionCounterTest.cpp
folly/fibers/Fiber.cpp
folly/fibers/Fiber.h
folly/ssl/OpenSSLHash.cpp
folly/ssl/OpenSSLHash.h
folly/test/SafeAssertTest.cpp
folly/test/ScopeGuardTest.cpp
folly/test/SubprocessTestParentDeathHelper.cpp
folly/test/function_benchmark/test_functions.cpp
folly/test/function_benchmark/test_functions.h

index 0f00e6e..6291ffe 100644 (file)
@@ -102,19 +102,11 @@ constexpr std::size_t checkOverflowOrNpos(std::size_t i, std::size_t max) {
 }
 
 // Intentionally NOT constexpr. See note above for assertOutOfBounds
-inline void assertOutOfBoundsNothrow() {
-  assert(false && "Array index out of bounds in BasicFixedString");
-}
-
-constexpr std::size_t checkOverflowNothrow(std::size_t i, std::size_t max) {
-  return i <= max ? i : (assertOutOfBoundsNothrow(), i);
-}
-
-// Intentionally NOT constexpr. See note above for assertOutOfBounds
-inline void assertNotNullTerminated() noexcept {
+[[noreturn]] inline void assertNotNullTerminated() noexcept {
   assert(
       false &&
       "Non-null terminated string used to initialize a BasicFixedString");
+  std::terminate(); // Fail hard, fail fast.
 }
 
 // Parsing help for human readers: the following is a constexpr noexcept
@@ -1153,7 +1145,7 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase {
 #ifdef NDEBUG
     return data_[i];
 #else
-    return data_[detail::fixedstring::checkOverflowNothrow(i, size_)];
+    return data_[detail::fixedstring::checkOverflow(i, size_)];
 #endif
   }
 
@@ -1164,21 +1156,21 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase {
 #ifdef NDEBUG
     return data_[i];
 #else
-    return data_[detail::fixedstring::checkOverflowNothrow(i, size_)];
+    return data_[detail::fixedstring::checkOverflow(i, size_)];
 #endif
   }
 
   /**
    * \note Equivalent to `(*this)[0]`
    */
-  FOLLY_CPP14_CONSTEXPR Char& front() noexcept(false) {
+  FOLLY_CPP14_CONSTEXPR Char& front() noexcept {
     return (*this)[0u];
   }
 
   /**
    * \overload
    */
-  constexpr const Char& front() const noexcept(false) {
+  constexpr const Char& front() const noexcept {
     return (*this)[0u];
   }
 
@@ -1186,22 +1178,22 @@ class BasicFixedString : private detail::fixedstring::FixedStringBase {
    * \note Equivalent to `at(size()-1)`
    * \pre `!empty()`
    */
-  FOLLY_CPP14_CONSTEXPR Char& back() noexcept(false) {
+  FOLLY_CPP14_CONSTEXPR Char& back() noexcept {
 #ifdef NDEBUG
     return data_[size_ - 1u];
 #else
-    return data_[size_ - detail::fixedstring::checkOverflowNothrow(1u, size_)];
+    return data_[size_ - detail::fixedstring::checkOverflow(1u, size_)];
 #endif
   }
 
   /**
    * \overload
    */
-  constexpr const Char& back() const noexcept(false) {
+  constexpr const Char& back() const noexcept {
 #ifdef NDEBUG
     return data_[size_ - 1u];
 #else
-    return data_[size_ - detail::fixedstring::checkOverflowNothrow(1u, size_)];
+    return data_[size_ - detail::fixedstring::checkOverflow(1u, size_)];
 #endif
   }
 
index 7e224d0..a9c0c39 100644 (file)
@@ -24,7 +24,7 @@ namespace folly {
 
 namespace detail {
 
-void handleMallctlError(const char* cmd, int err) {
+[[noreturn]] void handleMallctlError(const char* cmd, int err) {
   assert(err != 0);
   throw std::runtime_error(
       sformat("mallctl {}: {} ({})", cmd, errnoStr(err), err));
index 5c66c47..2d74205 100644 (file)
@@ -27,7 +27,7 @@ namespace folly {
 
 namespace detail {
 
-void handleMallctlError(const char* cmd, int err);
+[[noreturn]] void handleMallctlError(const char* cmd, int err);
 
 template <typename T>
 void mallctlHelper(const char* cmd, T* out, T* in) {
index c04fee1..418889f 100644 (file)
@@ -256,7 +256,7 @@ struct StaticMetaBase {
 
   StaticMetaBase(ThreadEntry* (*threadEntry)(), bool strict);
 
-  ~StaticMetaBase() {
+  [[noreturn]] ~StaticMetaBase() {
     LOG(FATAL) << "StaticMeta lives forever!";
   }
 
index 4038af9..18dd25f 100644 (file)
@@ -168,7 +168,7 @@ folly::dynamic DynamicParser::ParserStack::releaseErrors() {
   return releaseErrorsImpl();
 }
 
-void DynamicParser::ParserStack::throwErrors() {
+[[noreturn]] void DynamicParser::ParserStack::throwErrors() {
   throw DynamicParserParseError(releaseErrorsImpl());
 }
 
index 4124d8c..8541313 100644 (file)
@@ -357,9 +357,9 @@ private:
     folly::dynamic releaseErrors();
 
     // Invoked on error when using OnError::THROW.
-    void throwErrors();
+    [[noreturn]] void throwErrors();
 
-  private:
+   private:
     friend struct Pop;
 
     folly::dynamic releaseErrorsImpl();  // for releaseErrors() & throwErrors()
index 2db6f9f..25a6652 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <folly/experimental/exception_tracer/ExceptionTracer.h>
 
-void bar() {
+[[noreturn]] void bar() {
   throw std::runtime_error("hello");
 }
 
@@ -45,7 +45,7 @@ void foo() {
   }
 }
 
-void baz() {
+[[noreturn]] void baz() {
   try {
     try {
       bar();
index 706177b..6751396 100644 (file)
 
 struct MyException {};
 
-void bar() { throw std::runtime_error("hello"); }
+[[noreturn]] void bar() {
+  throw std::runtime_error("hello");
+}
 
-void foo() { throw MyException(); }
+[[noreturn]] void foo() {
+  throw MyException();
+}
 
-void baz() { foo(); }
+[[noreturn]] void baz() {
+  foo();
+}
 
 using namespace folly::exception_tracer;
 
index de4124f..6caa9d5 100644 (file)
@@ -118,7 +118,7 @@ void Fiber::recordStackPosition() {
   VLOG(4) << "Stack usage: " << currentPosition;
 }
 
-void Fiber::fiberFunc() {
+[[noreturn]] void Fiber::fiberFunc() {
 #ifdef FOLLY_SANITIZE_ADDRESS
   fiberManager_.registerFinishSwitchStackWithAsan(
       nullptr, &asanMainStackBase_, &asanMainStackSize_);
index c43894f..82b73bc 100644 (file)
@@ -90,7 +90,7 @@ class Fiber {
   template <typename F, typename G>
   void setFunctionFinally(F&& func, G&& finally);
 
-  void fiberFunc();
+  [[noreturn]] void fiberFunc();
 
   /**
    * Switch out of fiber context into the main context,
index 9e3581a..7b1c439 100644 (file)
 namespace folly {
 namespace ssl {
 
-void OpenSSLHash::check_out_size_throw(size_t size, MutableByteRange out) {
+[[noreturn]] void OpenSSLHash::check_out_size_throw(
+    size_t size,
+    MutableByteRange out) {
   throw std::invalid_argument(folly::sformat(
       "expected out of size {} but was of size {}", size, out.size()));
 }
 
-void OpenSSLHash::check_libssl_result_throw() {
+[[noreturn]] void OpenSSLHash::check_libssl_result_throw() {
   throw std::runtime_error("openssl crypto function failed");
 }
 
index 5081fae..2a89e64 100644 (file)
@@ -173,7 +173,9 @@ class OpenSSLHash {
     }
     check_out_size_throw(size, out);
   }
-  static void check_out_size_throw(size_t size, MutableByteRange out);
+  [[noreturn]] static void check_out_size_throw(
+      size_t size,
+      MutableByteRange out);
 
   static inline void check_libssl_result(int expected, int result) {
     if (LIKELY(result == expected)) {
@@ -181,8 +183,7 @@ class OpenSSLHash {
     }
     check_libssl_result_throw();
   }
-  static void check_libssl_result_throw();
-
+  [[noreturn]] static void check_libssl_result_throw();
 };
 
 }
index 0cb59b9..f2015ce 100644 (file)
@@ -23,7 +23,7 @@
 
 using namespace folly;
 
-void fail() {
+[[noreturn]] void fail() {
   FOLLY_SAFE_CHECK(0 + 0, "hello");
 }
 
index 892a435..b3eb981 100644 (file)
@@ -295,6 +295,7 @@ TEST(ScopeGuard, TEST_THROWING_CLEANUP_ACTION) {
   struct ThrowingCleanupAction {
     explicit ThrowingCleanupAction(int& scopeExitExecuted)
         : scopeExitExecuted_(scopeExitExecuted) {}
+    [[noreturn]]
     ThrowingCleanupAction(const ThrowingCleanupAction& other)
         : scopeExitExecuted_(other.scopeExitExecuted_) {
       throw std::runtime_error("whoa");
index 68a601d..6dfa896 100644 (file)
@@ -60,7 +60,7 @@ void runChild(const char* file) {
   CHECK_ERR(creat(file, 0600));
 }
 
-void runParent(const char* file) {
+[[noreturn]] void runParent(const char* file) {
   std::vector<std::string> args {"/proc/self/exe", "--child", file};
   Subprocess proc(
       args,
index 7da5df9..0818b46 100644 (file)
@@ -36,6 +36,7 @@ class Exception : public std::exception {
 void doNothing() {
 }
 
+[[noreturn]]
 void throwException() {
   throw Exception("this is a test");
 }
index e248aa6..c6d82fe 100644 (file)
@@ -24,7 +24,7 @@
 
 void doNothing();
 
-void throwException();
+[[noreturn]] void throwException();
 std::exception_ptr returnExceptionPtr();
 void exceptionPtrReturnParam(std::exception_ptr* excReturn);
 std::string returnString();