]> granicus.if.org Git - llvm/commitdiff
[ADT] Add a default constructor and a bool conversion to function_ref.
authorChandler Carruth <chandlerc@gmail.com>
Sun, 9 Jul 2017 06:12:56 +0000 (06:12 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 9 Jul 2017 06:12:56 +0000 (06:12 +0000)
The internal representation has a natural way to handle this and it
seems nicer than having to wrap this in an optional (with its own
separate flag).

This also matches how std::function works.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307490 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/STLExtras.h
unittests/ADT/FunctionRefTest.cpp

index 8c28412bb607869285feda87b0ea786dd35d859f..83f289c42a23a1fa9fdc5a4a12ad179ab16b9f22 100644 (file)
@@ -100,6 +100,8 @@ class function_ref<Ret(Params...)> {
   }
 
 public:
+  function_ref() : callback(nullptr) {}
+
   template <typename Callable>
   function_ref(Callable &&callable,
                typename std::enable_if<
@@ -110,6 +112,8 @@ public:
   Ret operator()(Params ...params) const {
     return callback(callable, std::forward<Params>(params)...);
   }
+
+  operator bool() const { return callback; }
 };
 
 // deleter - Very very very simple method that is used to invoke operator
index 075d9a070df72afe69c6c865f388375c87343771..b7ef7d79e5f99f8636ec60d55da8d0dcc0fbeddd 100644 (file)
@@ -14,6 +14,20 @@ using namespace llvm;
 
 namespace {
 
+// Ensure that there is a default constructor and we can test for a null
+// function_ref.
+TEST(FunctionRefTest, Null) {
+  function_ref<int()> F;
+  EXPECT_FALSE(F);
+
+  auto L = [] { return 1; };
+  F = L;
+  EXPECT_TRUE(F);
+
+  F = {};
+  EXPECT_FALSE(F);
+}
+
 // Ensure that copies of a function_ref copy the underlying state rather than
 // causing one function_ref to chain to the next.
 TEST(FunctionRefTest, Copy) {