From: Victor Leschuk Date: Thu, 26 Jul 2018 02:21:40 +0000 (+0000) Subject: [Support] Introduce createStringError helper function X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f4c9d7c0dc4517ed009f40231a0ff9da44e739c4;p=llvm [Support] Introduce createStringError helper function The function in question is copy-pasted lots of times in DWARF-related classes. Thus it will make sense to place its implementation into the Support library. Reviewed by: lhames Differential Revision: https://reviews.llvm.org/D49824 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337995 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/Error.h b/include/llvm/Support/Error.h index 3ea567b4bcf..8015cab45a0 100644 --- a/include/llvm/Support/Error.h +++ b/include/llvm/Support/Error.h @@ -24,6 +24,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorOr.h" +#include "llvm/Support/Format.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -1121,6 +1122,18 @@ private: std::error_code EC; }; +/// Create formatted StringError object. +template +Error createStringError(std::error_code EC, char const *Fmt, + const Ts &... Vals) { + std::string Buffer; + raw_string_ostream Stream(Buffer); + Stream << format(Fmt, Vals...); + return make_error(Stream.str(), EC); +} + +Error createStringError(std::error_code EC, char const *Msg); + /// Helper for check-and-exit error handling. /// /// For tool use only. NOT FOR USE IN LIBRARY CODE. diff --git a/lib/Support/Error.cpp b/lib/Support/Error.cpp index c43a1fa813e..83345bf6edb 100644 --- a/lib/Support/Error.cpp +++ b/lib/Support/Error.cpp @@ -112,6 +112,10 @@ std::error_code StringError::convertToErrorCode() const { return EC; } +Error createStringError(std::error_code EC, char const *Msg) { + return make_error(Msg, EC); +} + void report_fatal_error(Error Err, bool GenCrashDiag) { assert(Err && "report_fatal_error called with success value"); std::string ErrMsg; diff --git a/unittests/Support/ErrorTest.cpp b/unittests/Support/ErrorTest.cpp index 2f9ce2d5646..66ffd23f817 100644 --- a/unittests/Support/ErrorTest.cpp +++ b/unittests/Support/ErrorTest.cpp @@ -443,6 +443,29 @@ TEST(Error, StringError) { << "Failed to convert StringError to error_code."; } +TEST(Error, createStringError) { + static const char *Bar = "bar"; + static const std::error_code EC = errc::invalid_argument; + std::string Msg; + raw_string_ostream S(Msg); + logAllUnhandledErrors(createStringError(EC, "foo%s%d0x%" PRIx8, Bar, 1, 0xff), + S, ""); + EXPECT_EQ(S.str(), "foobar10xff\n") + << "Unexpected createStringError() log result"; + + S.flush(); + Msg.clear(); + logAllUnhandledErrors(createStringError(EC, Bar), S, ""); + EXPECT_EQ(S.str(), "bar\n") + << "Unexpected createStringError() (overloaded) log result"; + + S.flush(); + Msg.clear(); + auto Res = errorToErrorCode(createStringError(EC, "foo%s", Bar)); + EXPECT_EQ(Res, EC) + << "Failed to convert createStringError() result to error_code."; +} + // Test that the ExitOnError utility works as expected. TEST(Error, ExitOnError) { ExitOnError ExitOnErr;