From a329cf69696f1d1103c569b4c4d68d212b204710 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Wed, 20 Nov 2019 15:04:06 -0800 Subject: [PATCH] [Support][Error] Unfriend FileError. It is not special. FileError doesn't need direct access to Error's internals as it can access the payload via handleErrors. (ErrorList remains special: it is not possible to write a handler for it, due to the special auto-unpacking treatment that it receives from handleErrors.) --- llvm/include/llvm/Support/Error.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h index 350877a..75fca01 100644 --- a/llvm/include/llvm/Support/Error.h +++ b/llvm/include/llvm/Support/Error.h @@ -155,10 +155,10 @@ private: /// they're moved-assigned or constructed from Success values that have already /// been checked. This enforces checking through all levels of the call stack. class LLVM_NODISCARD Error { - // Both ErrorList and FileError need to be able to yank ErrorInfoBase - // pointers out of this class to add to the error list. + // ErrorList needs to be able to yank ErrorInfoBase pointers out of Errors + // to add to the error list. It can't rely on handleErrors for this, since + // handleErrors does not support ErrorList handlers. friend class ErrorList; - friend class FileError; // handleErrors needs to be able to set the Checked flag. template @@ -1251,8 +1251,14 @@ private: } static Error build(const Twine &F, Optional Line, Error E) { + std::unique_ptr Payload; + handleAllErrors(std::move(E), + [&](std::unique_ptr EIB) -> Error { + Payload = std::move(EIB); + return Error::success(); + }); return Error( - std::unique_ptr(new FileError(F, Line, E.takePayload()))); + std::unique_ptr(new FileError(F, Line, std::move(Payload)))); } std::string FileName; -- 2.7.4