[PATCH] D112278: Support: Add Expected<T>::moveInto() to avoid extra names

Duncan P. N. Exon Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 21 16:05:10 PDT 2021


dexonsmith created this revision.
dexonsmith added reviewers: lhames, dblaikie.
dexonsmith requested review of this revision.
Herald added a project: LLVM.

Expected<T>::moveInto() takes as an out parameter any `OtherT&` that's
assignable from `T&&`. It moves any stored value before returning
takeError().

There are two existing patterns that moveInto() cleans up:

  // If the variable is new:
  Expected<std::unique_ptr<int>> ExpectedP = makePointer();
  if (!ExpectedP)
    return ExpectedP.takeError();
  std::unique_ptr<int> P = std::move(*ExpectedP);
  
  // If the target variable already exists:
  if (Expected<T> ExpectedP = makePointer())
    P = std::move(*ExpectedP);
  else
    return ExpectedP.takeError();

moveInto() takes less typing and avoids needing to name (or leak into
the scope) an extra variable.

  // If the variable is new:
  std::unique_ptr<int> P;
  if (Error E = makePointer().moveInto(P))
    return E;
  
  // If the target variable already exists:
  if (Error E = makePointer().moveInto(P))
    return E;

Another use case is writing unit tests, to log errors (but continue)
when there's an unexpected failure. E.g.:

  // Crash on error, or undefined in non-asserts builds.
  std::unique_ptr<MemoryBuffer> MB = cantFail(makeMemoryBuffer());
  
  // Avoid crashing on error without moveInto() :(.
  Expected<std::unique_ptr<MemoryBuffer>>
      ExpectedMB = makeMemoryBuffer();
  ASSERT_THAT_ERROR(ExpectedMB.takeError(), Succeeded());
  std::unique_ptr<MemoryBuffer> MB = std::move(ExpectedMB);
  
  // Avoid crashing on error with moveInto() :).
  std::unique_ptr<MemoryBuffer> MB;
  ASSERT_THAT_ERROR(makeMemoryBuffer().moveInto(MB), Succeeded());


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D112278

Files:
  llvm/docs/ProgrammersManual.rst
  llvm/include/llvm/Support/Error.h
  llvm/unittests/Support/ErrorTest.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112278.381417.patch
Type: text/x-patch
Size: 4941 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211021/550ca8b7/attachment.bin>


More information about the llvm-commits mailing list