make extent_hooks static.
[folly.git] / folly / Expected.h
index 0bf217c74a23725c8f84597b0f90fa392f58ea7f..2b791c117810d73f6772e18645c90de2287d7546 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2016 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -181,11 +181,11 @@ struct ExpectedStorage {
   };
   Which which_;
 
-  template <class E = Error, class = decltype(E())>
-  constexpr ExpectedStorage() noexcept(noexcept(E()))
-      : error_(), which_(Which::eError) {}
+  template <class E = Error, class = decltype(E{})>
+  constexpr ExpectedStorage() noexcept(noexcept(E{}))
+      : error_{}, which_(Which::eError) {}
   explicit constexpr ExpectedStorage(EmptyTag) noexcept
-      : ch_(), which_(Which::eEmpty) {}
+      : ch_{}, which_(Which::eEmpty) {}
   template <class... Vs>
   explicit constexpr ExpectedStorage(ValueTag, Vs&&... vs) noexcept(
       noexcept(Value(static_cast<Vs&&>(vs)...)))
@@ -233,6 +233,11 @@ struct ExpectedStorage {
   Value&& value() && {
     return std::move(value_);
   }
+  // TODO (t17322426): remove when VS2015 support is deprecated
+  // VS2015 static analyzer incorrectly flags these as unreachable in certain
+  // circumstances. VS2017 does not have this problem on the same code.
+  FOLLY_PUSH_WARNING
+  FOLLY_MSVC_DISABLE_WARNING(4702) // unreachable code
   Error& error() & {
     return error_;
   }
@@ -242,6 +247,7 @@ struct ExpectedStorage {
   Error&& error() && {
     return std::move(error_);
   }
+  FOLLY_POP_WARNING
 };
 
 template <class Value, class Error>
@@ -249,12 +255,11 @@ struct ExpectedUnion {
   union {
     Value value_;
     Error error_;
-    char ch_;
+    char ch_{};
   };
-  Which which_;
+  Which which_ = Which::eEmpty;
 
-  explicit constexpr ExpectedUnion(EmptyTag = {}) noexcept
-      : ch_(), which_(Which::eEmpty) {}
+  explicit constexpr ExpectedUnion(EmptyTag) noexcept {}
   template <class... Vs>
   explicit constexpr ExpectedUnion(ValueTag, Vs&&... vs) noexcept(
       noexcept(Value(static_cast<Vs&&>(vs)...)))
@@ -396,8 +401,8 @@ struct ExpectedStorage<Value, Error, StorageType::eUnion>
   using value_type = Value;
   using error_type = Error;
   using Base = ExpectedUnion<Value, Error>;
-  template <class E = Error, class = decltype(E())>
-  constexpr ExpectedStorage() noexcept(noexcept(E())) : Base{ErrorTag{}} {}
+  template <class E = Error, class = decltype(E{})>
+  constexpr ExpectedStorage() noexcept(noexcept(E{})) : Base{ErrorTag{}} {}
   ExpectedStorage(const ExpectedStorage&) = default;
   ExpectedStorage(ExpectedStorage&&) = default;
   ExpectedStorage& operator=(const ExpectedStorage&) = default;
@@ -446,7 +451,7 @@ struct ExpectedStorage<Value, Error, StorageType::eUnion>
       this->which_ = Which::eError;
     }
   }
-  bool isThis(const ExpectedStorage* that) const {
+  bool isSelfAssign(const ExpectedStorage* that) const {
     return this == that;
   }
   constexpr bool isSelfAssign(const void*) const {
@@ -480,17 +485,17 @@ struct ExpectedStorage<Value, Error, StorageType::ePODStruct> {
   Value value_;
 
   constexpr ExpectedStorage() noexcept
-      : which_(Which::eError), error_(), value_() {}
+      : which_(Which::eError), error_{}, value_{} {}
   explicit constexpr ExpectedStorage(EmptyTag) noexcept
-      : which_(Which::eEmpty), error_(), value_() {}
+      : which_(Which::eEmpty), error_{}, value_{} {}
   template <class... Vs>
   explicit constexpr ExpectedStorage(ValueTag, Vs&&... vs) noexcept(
       noexcept(Value(static_cast<Vs&&>(vs)...)))
-      : which_(Which::eValue), error_(), value_(static_cast<Vs&&>(vs)...) {}
+      : which_(Which::eValue), error_{}, value_(static_cast<Vs&&>(vs)...) {}
   template <class... Es>
   explicit constexpr ExpectedStorage(ErrorTag, Es&&... es) noexcept(
       noexcept(Error(static_cast<Es&&>(es)...)))
-      : which_(Which::eError), error_(static_cast<Es&&>(es)...), value_() {}
+      : which_(Which::eError), error_(static_cast<Es&&>(es)...), value_{} {}
   void clear() noexcept {}
   constexpr static bool uninitializedByException() noexcept {
     return false;
@@ -528,6 +533,11 @@ struct ExpectedStorage<Value, Error, StorageType::ePODStruct> {
   Value&& value() && {
     return std::move(value_);
   }
+  // TODO (t17322426): remove when VS2015 support is deprecated
+  // VS2015 static analyzer incorrectly flags these as unreachable in certain
+  // circumstances. VS2017 does not have this problem on the same code.
+  FOLLY_PUSH_WARNING
+  FOLLY_MSVC_DISABLE_WARNING(4702) // unreachable code
   Error& error() & {
     return error_;
   }
@@ -537,6 +547,7 @@ struct ExpectedStorage<Value, Error, StorageType::ePODStruct> {
   Error&& error() && {
     return std::move(error_);
   }
+  FOLLY_POP_WARNING
 };
 
 namespace expected_detail_ExpectedHelper {
@@ -661,7 +672,7 @@ class Unexpected final {
   class BadExpectedAccess : public folly::BadExpectedAccess {
    public:
     explicit BadExpectedAccess(Error err)
-        : folly::BadExpectedAccess(), error_(std::move(err)) {}
+        : folly::BadExpectedAccess{}, error_(std::move(err)) {}
     /**
      * The error code that was held by the Expected object when the user
      * erroneously requested the value.
@@ -892,7 +903,7 @@ class Expected final : expected_detail::ExpectedStorage<Value, Error> {
    * Constructors
    */
   template <class B = Base, class = decltype(B{})>
-  Expected() noexcept(noexcept(B{})) : Base() {}
+  Expected() noexcept(noexcept(B{})) : Base{} {}
   Expected(const Expected& that) = default;
   Expected(Expected&& that) = default;
 
@@ -1198,7 +1209,7 @@ class Expected final : expected_detail::ExpectedStorage<Value, Error> {
    * thenOrThrow
    */
   template <class Yes, class No = MakeBadExpectedAccess>
-  auto thenOrThrow(Yes&& yes, No&& no = No()) const& -> decltype(
+  auto thenOrThrow(Yes&& yes, No&& no = No{}) const& -> decltype(
       std::declval<Yes>()(std::declval<const Value&>())) {
     using Ret = decltype(std::declval<Yes>()(std::declval<const Value&>()));
     if (this->uninitializedByException())
@@ -1208,7 +1219,7 @@ class Expected final : expected_detail::ExpectedStorage<Value, Error> {
   }
 
   template <class Yes, class No = MakeBadExpectedAccess>
-  auto thenOrThrow(Yes&& yes, No&& no = No()) & -> decltype(
+  auto thenOrThrow(Yes&& yes, No&& no = No{}) & -> decltype(
       std::declval<Yes>()(std::declval<Value&>())) {
     using Ret = decltype(std::declval<Yes>()(std::declval<Value&>()));
     if (this->uninitializedByException())
@@ -1218,7 +1229,7 @@ class Expected final : expected_detail::ExpectedStorage<Value, Error> {
   }
 
   template <class Yes, class No = MakeBadExpectedAccess>
-  auto thenOrThrow(Yes&& yes, No&& no = No()) && -> decltype(
+  auto thenOrThrow(Yes&& yes, No&& no = No{}) && -> decltype(
       std::declval<Yes>()(std::declval<Value&&>())) {
     using Ret = decltype(std::declval<Yes>()(std::declval<Value&&>()));
     if (this->uninitializedByException())