[llvm] r280016 - [ORC][RPC] Make the future type of an Orc RPC call Error/Expected rather than

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 30 08:11:20 PDT 2016


The tests still fail at runtime, because their std::future implementation
constructs Error objects that are destroyed without being checked:

$ ./unittests/ExecutionEngine/Orc/OrcJITTests.exe
--gtest_filter=DummyRPC.TestSerialization
Note: Google Test filter = DummyRPC.TestSerialization
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from DummyRPC
[ RUN      ] DummyRPC.TestSerialization
Program aborted due to an unhandled Error:
Error value was Success. (Note: Success values must still be checked prior
to being destroyed).
#0 0x00d9bbe7 HandleAbort c:\src\llvm\lib\support\windows\signals.inc:404:0
#1 0x0175e7f5 raise
d:\th\minkernel\crts\ucrt\src\appcrt\misc\signal.cpp:516:0
#2 0x01737b04 abort
d:\th\minkernel\crts\ucrt\src\appcrt\startup\abort.cpp:64:0
#3 0x00bab53c llvm::Error::assertIsChecked(void)
c:\src\llvm\include\llvm\support\error.h:235:0
#4 0x00bc3815 ?_Set_value_raw@?$_Associated_state at VError@llvm@@@std@
@QAEX$$QAVError at llvm@@PAV?$unique_lock at Vmutex@std@@@2 at _N@Z c:\program files
(x86)\microsoft visual studio 14.0\vc\include\future:394:0
#5 0x00bc3721 ?_Set_value@?$_Associated_state at VError@llvm@@@std@
@QAEX$$QAVError at llvm@@_N at Z c:\program files (x86)\microsoft visual studio
14.0\vc\include\future:386:0
#6 0x00bc574d ?set_value@?$promise at VError@llvm@@@std@@QAEX$$QAVError at llvm@@@Z
c:\program files (x86)\microsoft visual studio 14.0\vc\include\future:1547:0
#7 0x00bc5464 llvm::orc::remote::RPC<class QueueChannel,unsigned
int,unsigned short>::OutstandingResultImpl<class
llvm::orc::remote::RPCBase::FunctionHelper<unsigned int,4,void (signed
char,unsigned char,short,unsigned short,int,unsigned int,__int64,unsigned
__int64,bool,class std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >,class
std::vector<int,class std::allocator<int> >)> >::readResult(class
QueueChannel &)
c:\src\llvm\include\llvm\executionengine\orc\rpcutils.h:682:0
#8 0x00bc4e88 llvm::orc::remote::RPC<class QueueChannel,unsigned
int,unsigned short>::handleResponse(class QueueChannel &,unsigned short *)
c:\src\llvm\include\llvm\executionengine\orc\rpcutils.h:580:0
#9 0x00bc07a3 llvm::orc::remote::RPC<class QueueChannel,unsigned
int,unsigned short>::waitForResult<class llvm::Error (class QueueChannel
&,unsigned int)>(class QueueChannel &,unsigned short,class llvm::Error
(&)(class QueueChannel &,unsigned int))
c:\src\llvm\include\llvm\executionengine\orc\rpcutils.h:605:0
#10 0x00bb7fe4 DummyRPC_TestSerialization_Test::TestBody(void)
c:\src\llvm\unittests\executionengine\orc\rpcutilstest.cpp:178:0
#11 0x00f81e80
testing::internal::HandleSehExceptionsInMethodIfSupported<class
testing::Test,void>(class testing::Test *,void (
testing::Test::*)(void),char const *)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:2075:0
#12 0x00f93b9d testing::Test::Run(void)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:2161:0
#13 0x00f93d92 testing::TestInfo::Run(void)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:2313:0
#14 0x00f93c76 testing::TestCase::Run(void)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:2416:0
#15 0x00f94079 testing::internal::UnitTestImpl::RunAllTests(void)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:4207:0
#16 0x00f82110
testing::internal::HandleSehExceptionsInMethodIfSupported<class
testing::internal::UnitTestImpl,bool>(class testing::internal::UnitTestImpl
*,bool ( testing::internal::UnitTestImpl::*)(void),char const *)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:2075:0
#17 0x00f93e82 testing::UnitTest::Run(void)
c:\src\llvm\utils\unittest\googletest\src\gtest.cc:3841:0
#18 0x016fce32 _scrt_common_main_seh
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:253:0
#19 0x76ac38f4 (C:\Windows\SYSTEM32\KERNEL32.DLL+0x138f4)
#20 0x76f95de3 (C:\Windows\SYSTEM32\ntdll.dll+0x65de3)
#21 0x76f95dae (C:\Windows\SYSTEM32\ntdll.dll+0x65dae)

I guess the way to work around this is to create some kind of wrapper
around the Error that is trivially copyable etc, and pull the Error out on
the other side of the future.

On Mon, Aug 29, 2016 at 11:10 PM, Lang Hames via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Hi Douglas,
>
> Hopefully this should be fixed by r280058 and r280059.
>
> Cheers,
> Lang.
>
> On Mon, Aug 29, 2016 at 7:40 PM, Lang Hames <lhames at gmail.com> wrote:
>
>> Hi Yung,
>>
>> Bummer.
>>
>> At first glance this looks like a failure to construct a future for a
>> type with no default constructor - is that your read? Do you know if MSVC
>> 2013's futures library supports that?
>>
>> I'm on the road, but will be back in ~3 hours - when I get back I can try
>> some workarounds for this. If that's too long for the builders, feel free
>> to revert for now.
>>
>> - Lang.
>>
>>
>> On Mon, Aug 29, 2016 at 5:44 PM, Yung, Douglas <douglas.yung at sony.com>
>> wrote:
>>
>>> Hi Lang,
>>>
>>> I believe your checkin caused the Windows build to break when compiling
>>> with Visual Studio 2013. When building your change, I am seeing the
>>> following errors:
>>>
>>> C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(294): error C2512: 'llvm::Expected<int>' : no
>>> appropriate default constructor available [C:\src\build\tools\lli\lli.vc
>>> xproj]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(286) : while compiling class template member
>>> function 'std::_Associated_state<_Ty>::_Associated_state(std::_Deleter_base<_Ty>
>>> *)'
>>>           with
>>>           [
>>>               _Ty=llvm::Expected<int>
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(1481) : see reference to function template
>>> instantiation 'std::_Associated_state<_Ty>::
>>> _Associated_state(std::_Deleter_base<_Ty> *)' being compiled
>>>           with
>>>           [
>>>               _Ty=llvm::Expected<int>
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(1018) : see reference to class template
>>> instantiation 'std::_Associated_state<_Ty>' being compiled
>>>           with
>>>           [
>>>               _Ty=llvm::Expected<int>
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(1014) : while compiling class template member
>>> function 'llvm::Expected<int> &std::_State_manager<_Ty>::_Get_value(void)
>>> const'
>>>           with
>>>           [
>>>               _Ty=llvm::Expected<int>
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(1132) : see reference to function template
>>> instantiation 'llvm::Expected<int> &std::_State_manager<_Ty>::_Get_value(void)
>>> const' being compiled
>>>           with
>>>           [
>>>               _Ty=llvm::Expected<int>
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\future(1101) : see reference to class template
>>> instantiation 'std::_State_manager<_Ty>' being compiled
>>>           with
>>>           [
>>>               _Ty=llvm::Expected<int>
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\utility(198) : see reference to class template
>>> instantiation 'std::future<llvm::Expected<int>>' being compiled
>>>           C:\src\llvm\include\llvm/Support/AlignOf.h(224) : see
>>> reference to class template instantiation 'std::pair<std::future<llvm::E
>>> xpected<int>>,SequenceNumberT>' being compiled
>>>           with
>>>           [
>>>               SequenceNumberT=uint16_t
>>>           ]
>>>           C:\Program Files (x86)\Microsoft Visual Studio
>>> 12.0\VC\include\type_traits(584) : see reference to class template
>>> instantiation 'llvm::detail::AlignerImpl<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>'
>>> being compiled
>>>           with
>>>           [
>>>               T1=std::pair<std::future<llvm::Expected<int>>,uint16_t>
>>>   ,            T2=char
>>>   ,            T3=char
>>>   ,            T4=char
>>>   ,            T5=char
>>>   ,            T6=char
>>>   ,            T7=char
>>>   ,            T8=char
>>>   ,            T9=char
>>>   ,            T10=char
>>>           ]
>>>           C:\src\llvm\include\llvm/Support/AlignOf.h(83) : see
>>> reference to class template instantiation 'std::is_abstract<T>' being
>>> compiled
>>>           with
>>>           [
>>>               T=llvm::detail::AlignerImpl<st
>>> d::pair<std::future<llvm::Expected<int>>,uint16_t>,char,char
>>> ,char,char,char,char,char,char,char>
>>>           ]
>>>           C:\src\llvm\include\llvm/Support/AlignOf.h(253) : see
>>> reference to class template instantiation 'llvm::AlignOf<llvm::detail::A
>>> lignerImpl<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>>' being compiled
>>>   Building Custom Rule C:/src/llvm/tools/clang/tools/
>>> arcmt-test/CMakeLists.txt
>>>           with
>>>           [
>>>               T1=std::pair<std::future<llvm::Expected<int>>,uint16_t>
>>>   ,            T2=char
>>>   ,            T3=char
>>>   ,            T4=char
>>>   ,            T5=char
>>>   ,            T6=char
>>>   ,            T7=char
>>>   ,            T8=char
>>>   ,            T9=char
>>>   ,            T10=char
>>>           ]
>>>           C:\src\llvm\include\llvm/Support/Error.h(831) : see reference
>>> to class template instantiation 'llvm::AlignedCharArrayUnion<s
>>> td::pair<std::future<llvm::Expected<int>>,SequenceNumberT>,c
>>> har,char,char,char,char,char,char,char,char>' being compiled
>>>           with
>>>           [
>>>   CMake does not need to re-run because C:\src\build\tools\clang\tools
>>> \arcmt-test\CMakeFiles\generate.stamp is up-to-date.
>>>               SequenceNumberT=uint16_t
>>>           ]
>>>           c:\src\llvm\include\llvm\executionengine\orc\RPCUtils.h(447)
>>> : see reference to class template instantiation
>>> 'llvm::Expected<std::pair<std::future<llvm::Expected<int>>,SequenceNumberT>>'
>>> being compiled
>>>           with
>>>           [
>>>               SequenceNumberT=uint16_t
>>>           ]
>>>           C:\src\llvm\include\llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h(606)
>>> : see reference to function template instantiation 'llvm::Expected<int>
>>> llvm::orc::remote::RPC<llvm::orc::remote::RPCChannel,uint32_
>>> t,uint16_t>::callSTHandling<llvm::orc::remote::OrcRemoteTarg
>>> etRPCAPI::CallIntVoid,llvm::orc::remote::OrcRemoteTargetClient<llvm::or
>>> c::remote::RPCChannel>::callIntVoid::<lambda_1e43ba3f76d8196
>>> 46569b43fe46505bc>,llvm::JITTargetAddress>(ChannelT &,HandleFtor
>>> &,const llvm::JITTargetAddress &)' being compiled
>>>           with
>>>           [
>>>               ChannelT=llvm::orc::remote::RPCChannel
>>>   ,            HandleFtor=llvm::orc::remote::
>>> OrcRemoteTargetClient<llvm::orc::remote::RPCChannel>::callIn
>>> tVoid::<lambda_1e43ba3f76d819646569b43fe46505bc>
>>>           ]
>>>           C:\src\llvm\include\llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h(606)
>>> : see reference to function template instantiation 'llvm::Expected<int>
>>> llvm::orc::remote::RPC<llvm::orc::remote::RPCChannel,uint32_
>>> t,uint16_t>::callSTHandling<llvm::orc::remote::OrcRemoteTarg
>>> etRPCAPI::CallIntVoid,llvm::orc::remote::OrcRemoteTargetClient<llvm::or
>>> c::remote::RPCChannel>::callIntVoid::<lambda_1e43ba3f76d8196
>>> 46569b43fe46505bc>,llvm::JITTargetAddress>(ChannelT &,HandleFtor
>>> &,const llvm::JITTargetAddress &)' being compiled
>>>           with
>>>           [
>>>               ChannelT=llvm::orc::remote::RPCChannel
>>>   ,            HandleFtor=llvm::orc::remote::
>>> OrcRemoteTargetClient<llvm::orc::remote::RPCChannel>::callIn
>>> tVoid::<lambda_1e43ba3f76d819646569b43fe46505bc>
>>>           ]
>>>           C:\src\llvm\include\llvm/ExecutionEngine/Orc/OrcRemoteTargetClient.h(600)
>>> : while compiling class template member function 'llvm::Expected<int>
>>> llvm::orc::remote::OrcRemoteTargetClient<llvm::orc::remote::
>>> RPCChannel>::callIntVoid(llvm::JITTargetAddress)'
>>>           C:\src\llvm\tools\lli\lli.cpp(694) : see reference to
>>> function template instantiation 'llvm::Expected<int>
>>> llvm::orc::remote::OrcRemoteTargetClient<llvm::orc::remote::
>>> RPCChannel>::callIntVoid(llvm::JITTargetAddress)' being compiled
>>>           C:\src\llvm\tools\lli\lli.cpp(666) : see reference to class
>>> template instantiation 'llvm::orc::remote::OrcRemoteT
>>> argetClient<llvm::orc::remote::RPCChannel>' being compiled
>>>   OrcLazyJIT.cpp
>>>
>>>
>>> Can you take a look into this?
>>>
>>> Douglas Yung
>>>
>>> > -----Original Message-----
>>> > From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
>>> > Behalf Of Lang Hames via llvm-commits
>>> > Sent: Monday, August 29, 2016 14:57
>>> > To: llvm-commits at lists.llvm.org
>>> > Subject: [llvm] r280016 - [ORC][RPC] Make the future type of an Orc RPC
>>> > call Error/Expected rather than
>>> >
>>> > Author: lhames
>>> > Date: Mon Aug 29 16:56:30 2016
>>> > New Revision: 280016
>>> >
>>> > URL: http://llvm.org/viewvc/llvm-project?rev=280016&view=rev
>>> > Log:
>>> > [ORC][RPC] Make the future type of an Orc RPC call Error/Expected
>>> > rather than Optional.
>>> >
>>> > For void functions the return type of a nonblocking call changes from
>>> > Expected<future<Optional<bool>>> to Expected<future<Error>>, and for
>>> > functions returning T the return type changes from
>>> > Expected<future<Optional<T>>> to Expected<future<Expected<T>>>.
>>> >
>>> > Inner results need to be checked (since the RPC connection may have
>>> > dropped out before a result came back) and Error/Expected provide
>>> > stronger checking requirements. It also allows us drop the crufty
>>> > 'optionalToError' function and just collapse Errors in the single-
>>> > threaded call primitives.
>>> >
>>> >
>>> > Modified:
>>> >     llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
>>> >     llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp
>>> >
>>> > Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h
>>> > URL: http://llvm.org/viewvc/llvm-
>>> > project/llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils
>>> .h?rev=2800
>>> > 16&r1=280015&r2=280016&view=diff
>>> > ============================================================
>>> ===========
>>> > =======
>>> > --- llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h (original)
>>> > +++ llvm/trunk/include/llvm/ExecutionEngine/Orc/RPCUtils.h Mon Aug 29
>>> > +++ 16:56:30 2016
>>> > @@ -17,7 +17,6 @@
>>> >  #include <map>
>>> >  #include <vector>
>>> >
>>> > -#include "llvm/ADT/Optional.h"
>>> >  #include "llvm/ADT/STLExtras.h"
>>> >  #include "llvm/ExecutionEngine/Orc/OrcError.h"
>>> >
>>> > @@ -61,6 +60,7 @@ public:
>>> >  // partially specialized.
>>> >  class RPCBase {
>>> >  protected:
>>> > +
>>> >    // RPC Function description type.
>>> >    //
>>> >    // This class provides the information and operations needed to
>>> > support the @@ -69,10 +69,7 @@ protected:
>>> >    // betwen the two. Both specializations have the same interface:
>>> >    //
>>> >    // Id - The function's unique identifier.
>>> > -  // OptionalReturn - The return type for asyncronous calls.
>>> > -  // ErrorReturn - The return type for synchronous calls.
>>> > -  // optionalToErrorReturn - Conversion from a valid OptionalReturn to
>>> > an
>>> > -  //                         ErrorReturn.
>>> > +  // ErrorReturn - The return type for blocking calls.
>>> >    // readResult - Deserialize a result from a channel.
>>> >    // abandon - Abandon a promised (asynchronous) result.
>>> >    // respond - Retun a result on the channel.
>>> > @@ -91,32 +88,25 @@ protected:
>>> >
>>> >      static const FunctionIdT Id = FuncId;
>>> >
>>> > -    typedef Optional<RetT> OptionalReturn;
>>> > -
>>> >      typedef Expected<RetT> ErrorReturn;
>>> >
>>> > -    static ErrorReturn optionalToErrorReturn(OptionalReturn &&V) {
>>> > -      assert(V && "Return value not available");
>>> > -      return std::move(*V);
>>> > -    }
>>> > -
>>> >      template <typename ChannelT>
>>> > -    static Error readResult(ChannelT &C, std::promise<OptionalReturn>
>>> > &P) {
>>> > +    static Error readResult(ChannelT &C, std::promise<ErrorReturn> &P)
>>> > + {
>>> >        RetT Val;
>>> >        auto Err = deserialize(C, Val);
>>> >        auto Err2 = endReceiveMessage(C);
>>> >        Err = joinErrors(std::move(Err), std::move(Err2));
>>> > -
>>> > -      if (Err) {
>>> > -        P.set_value(OptionalReturn());
>>> > +      if (Err)
>>> >          return Err;
>>> > -      }
>>> > +
>>> >        P.set_value(std::move(Val));
>>> >        return Error::success();
>>> >      }
>>> >
>>> > -    static void abandon(std::promise<OptionalReturn> &P) {
>>> > -      P.set_value(OptionalReturn());
>>> > +    static void abandon(std::promise<ErrorReturn> &P) {
>>> > +      P.set_value(
>>> > +        make_error<StringError>("RPC function call failed to return",
>>> > +                                inconvertibleErrorCode()));
>>> >      }
>>> >
>>> >      template <typename ChannelT, typename SequenceNumberT> @@ -148,22
>>> > +138,20 @@ protected:
>>> >
>>> >      static const FunctionIdT Id = FuncId;
>>> >
>>> > -    typedef bool OptionalReturn;
>>> >      typedef Error ErrorReturn;
>>> >
>>> > -    static ErrorReturn optionalToErrorReturn(OptionalReturn &&V) {
>>> > -      assert(V && "Return value not available");
>>> > -      return Error::success();
>>> > -    }
>>> > -
>>> >      template <typename ChannelT>
>>> > -    static Error readResult(ChannelT &C, std::promise<OptionalReturn>
>>> > &P) {
>>> > +    static Error readResult(ChannelT &C, std::promise<ErrorReturn> &P)
>>> > + {
>>> >        // Void functions don't have anything to deserialize, so we're
>>> > good.
>>> > -      P.set_value(true);
>>> > +      P.set_value(Error::success());
>>> >        return endReceiveMessage(C);
>>> >      }
>>> >
>>> > -    static void abandon(std::promise<OptionalReturn> &P) {
>>> > P.set_value(false); }
>>> > +    static void abandon(std::promise<ErrorReturn> &P) {
>>> > +      P.set_value(
>>> > +        make_error<StringError>("RPC function call failed to return",
>>> > +                                inconvertibleErrorCode()));
>>> > +    }
>>> >
>>> >      template <typename ChannelT, typename SequenceNumberT>
>>> >      static Error respond(ChannelT &C, SequenceNumberT SeqNo, @@ -
>>> > 380,17 +368,17 @@ public:
>>> >
>>> >    /// Return type for asynchronous call primitives.
>>> >    template <typename Func>
>>> > -  using AsyncCallResult = std::future<typename Func::OptionalReturn>;
>>> > +  using AsyncCallResult = std::future<typename Func::ErrorReturn>;
>>> >
>>> >    /// Return type for asynchronous call-with-seq primitives.
>>> >    template <typename Func>
>>> >    using AsyncCallWithSeqResult =
>>> > -      std::pair<std::future<typename Func::OptionalReturn>,
>>> > SequenceNumberT>;
>>> > +      std::pair<AsyncCallResult<Func>, SequenceNumberT>;
>>> >
>>> >    /// Serialize Args... to channel C, but do not call C.send().
>>> >    ///
>>> >    /// Returns an error (on serialization failure) or a pair of:
>>> > -  /// (1) A future Optional<T> (or future<bool> for void functions),
>>> > and
>>> > +  /// (1) A future Expected<T> (or future<bool> for void functions),
>>> > + and
>>> >    /// (2) A sequence number.
>>> >    ///
>>> >    /// This utility function is primarily used for single-threaded mode
>>> > support, @@ -401,7 +389,7 @@ public:
>>> >    Expected<AsyncCallWithSeqResult<Func>>
>>> >    appendCallAsyncWithSeq(ChannelT &C, const ArgTs &... Args) {
>>> >      auto SeqNo = SequenceNumberMgr.getSequenceNumber();
>>> > -    std::promise<typename Func::OptionalReturn> Promise;
>>> > +    std::promise<typename Func::ErrorReturn> Promise;
>>> >      auto Result = Promise.get_future();
>>> >      OutstandingResults[SeqNo] =
>>> >          createOutstandingResult<Func>(std::move(Promise));
>>> > @@ -431,7 +419,7 @@ public:
>>> >
>>> >    /// Serialize Args... to channel C, but do not call send.
>>> >    /// Returns an error if serialization fails, otherwise returns a
>>> > -  /// std::future<Optional<T>> (or a future<bool> for void functions).
>>> > +  /// std::future<Expected<T>> (or a future<bool> for void functions).
>>> >    template <typename Func, typename... ArgTs>
>>> >    Expected<AsyncCallResult<Func>> appendCallAsync(ChannelT &C,
>>> >                                                    const ArgTs &...
>>> > Args) { @@ -460,7 +448,7 @@ public:
>>> >        auto &ResultAndSeqNo = *ResultAndSeqNoOrErr;
>>> >        if (auto Err = waitForResult(C, ResultAndSeqNo.second,
>>> > HandleOther))
>>> >          return std::move(Err);
>>> > -      return Func::optionalToErrorReturn(ResultAndSeqNo.first.get());
>>> > +      return ResultAndSeqNo.first.get();
>>> >      } else
>>> >        return ResultAndSeqNoOrErr.takeError();
>>> >    }
>>> > @@ -656,7 +644,7 @@ private:
>>> >    class OutstandingResultImpl : public OutstandingResult {
>>> >    private:
>>> >    public:
>>> > -    OutstandingResultImpl(std::promise<typename Func::OptionalReturn>
>>> > &&P)
>>> > +    OutstandingResultImpl(std::promise<typename Func::ErrorReturn>
>>> > &&P)
>>> >          : P(std::move(P)) {}
>>> >
>>> >      Error readResult(ChannelT &C) override { return
>>> > Func::readResult(C, P); } @@ -664,13 +652,13 @@ private:
>>> >      void abandon() override { Func::abandon(P); }
>>> >
>>> >    private:
>>> > -    std::promise<typename Func::OptionalReturn> P;
>>> > +    std::promise<typename Func::ErrorReturn> P;
>>> >    };
>>> >
>>> >    // Create an outstanding result for the given function.
>>> >    template <typename Func>
>>> >    std::unique_ptr<OutstandingResult>
>>> > -  createOutstandingResult(std::promise<typename Func::OptionalReturn>
>>> > &&P) {
>>> > +  createOutstandingResult(std::promise<typename Func::ErrorReturn>
>>> > &&P)
>>> > + {
>>> >      return
>>> > llvm::make_unique<OutstandingResultImpl<Func>>(std::move(P));
>>> >    }
>>> >
>>> >
>>> > Modified: llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp
>>> > URL: http://llvm.org/viewvc/llvm-
>>> > project/llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTes
>>> t.cpp?rev=2
>>> > 80016&r1=280015&r2=280016&view=diff
>>> > ============================================================
>>> ===========
>>> > =======
>>> > --- llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp
>>> > (original)
>>> > +++ llvm/trunk/unittests/ExecutionEngine/Orc/RPCUtilsTest.cpp Mon Aug
>>> > 29
>>> > +++ 16:56:30 2016
>>> > @@ -102,8 +102,8 @@ TEST_F(DummyRPC, TestAsyncVoidBool) {
>>> >    }
>>> >
>>> >    // Verify that the function returned ok.
>>> > -  auto Val = ResOrErr->first.get();
>>> > -  EXPECT_TRUE(Val) << "Remote void function failed to execute.";
>>> > +  auto Err = ResOrErr->first.get();
>>> > +  EXPECT_TRUE(!!Err) << "Remote void function failed to execute.";
>>> >  }
>>> >
>>> >  TEST_F(DummyRPC, TestAsyncIntInt) {
>>> > @@ -179,8 +179,8 @@ TEST_F(DummyRPC, TestSerialization) {
>>> >    }
>>> >
>>> >    // Verify that the function returned ok.
>>> > -  auto Val = ResOrErr->first.get();
>>> > -  EXPECT_TRUE(Val) << "Remote void function failed to execute.";
>>> > +  auto Err = ResOrErr->first.get();
>>> > +  EXPECT_TRUE(!!Err) << "Remote void function failed to execute.";
>>> >  }
>>> >
>>> >  // Test the synchronous call API.
>>> >
>>> >
>>> > _______________________________________________
>>> > llvm-commits mailing list
>>> > llvm-commits at lists.llvm.org
>>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160830/91d8addf/attachment.html>


More information about the llvm-commits mailing list