]> granicus.if.org Git - llvm/commitdiff
Add a cantFail overload for Expected-reference (Expected<T&>) types.
authorLang Hames <lhames@gmail.com>
Tue, 20 Jun 2017 22:18:02 +0000 (22:18 +0000)
committerLang Hames <lhames@gmail.com>
Tue, 20 Jun 2017 22:18:02 +0000 (22:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305863 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Error.h
unittests/Support/ErrorTest.cpp

index 1e27e0b821f055237e9104f83a971e4446b29ba7..9a7fa0ae6356cc9e06237cb4004672be1ae53921 100644 (file)
@@ -1076,6 +1076,27 @@ T cantFail(Expected<T> ValOrErr) {
     llvm_unreachable("Failure value returned from cantFail wrapped call");
 }
 
+/// Report a fatal error if ValOrErr is a failure value, otherwise unwraps and
+/// returns the contained reference.
+///
+/// This function can be used to wrap calls to fallible functions ONLY when it
+/// is known that the Error will always be a success value. E.g.
+///
+///   @code{.cpp}
+///   // foo only attempts the fallible operation if DoFallibleOperation is
+///   // true. If DoFallibleOperation is false then foo always returns a Bar&.
+///   Expected<Bar&> foo(bool DoFallibleOperation);
+///
+///   Bar &X = cantFail(foo(false));
+///   @endcode
+template <typename T>
+T& cantFail(Expected<T&> ValOrErr) {
+  if (ValOrErr)
+    return *ValOrErr;
+  else
+    llvm_unreachable("Failure value returned from cantFail wrapped call");
+}
+
 } // end namespace llvm
 
 #endif // LLVM_SUPPORT_ERROR_H
index 382346cd231acc57d660e01cdf7722e5831b2960..299fc50b469790209d32135efda46368d8f05afd 100644 (file)
@@ -475,6 +475,10 @@ TEST(Error, CantFailSuccess) {
 
   int X = cantFail(Expected<int>(42));
   EXPECT_EQ(X, 42) << "Expected value modified by cantFail";
+
+  int Dummy = 42;
+  int &Y = cantFail(Expected<int&>(Dummy));
+  EXPECT_EQ(&Dummy, &Y) << "Reference mangled by cantFail";
 }
 
 // Test that cantFail results in a crash if you pass it a failure value.