aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Support/ErrorTest.cpp
diff options
context:
space:
mode:
authorAlex Langford <alangford@apple.com>2024-02-16 16:26:14 -0800
committerGitHub <noreply@github.com>2024-02-16 16:26:14 -0800
commit4bb0ca655bb65aae0a1d251ba5053aadff678101 (patch)
tree41c63dd505c494cd7b99d5ece74b637e9192c5bd /llvm/unittests/Support/ErrorTest.cpp
parent3d67cf681a728e4cf0ab9947c0dd07539dda8b74 (diff)
downloadllvm-4bb0ca655bb65aae0a1d251ba5053aadff678101.zip
llvm-4bb0ca655bb65aae0a1d251ba5053aadff678101.tar.gz
llvm-4bb0ca655bb65aae0a1d251ba5053aadff678101.tar.bz2
[Support] Introduce formatv variant of createStringError (#80493)
Many times I have found myself wanting to create a StringError with the ability to interpolate a StringRef into the error string. This can be achieved with: StringRef Foo("..."); auto Err = createStringError(..., "Something went wrong: %s", Foo.str().c_str()); However, this requires us to construct a temporary std::string (which may perform a memory allocation if large enough). I propose a new variant of `createStringError` called `createStringErrorV` which uses `formatv` under the hood. This allows the above example to become: StringRef Foo("..."); auto Err = createStringErrorV(..., "Something went wrong: {0}", Foo);
Diffstat (limited to 'llvm/unittests/Support/ErrorTest.cpp')
-rw-r--r--llvm/unittests/Support/ErrorTest.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/unittests/Support/ErrorTest.cpp b/llvm/unittests/Support/ErrorTest.cpp
index 11f9320..a700a50 100644
--- a/llvm/unittests/Support/ErrorTest.cpp
+++ b/llvm/unittests/Support/ErrorTest.cpp
@@ -472,6 +472,23 @@ TEST(Error, createStringError) {
<< "Failed to convert createStringError() result to error_code.";
}
+TEST(Error, createStringErrorV) {
+ static llvm::StringRef Bar("bar");
+ static const std::error_code EC = errc::invalid_argument;
+ std::string Msg;
+ raw_string_ostream S(Msg);
+ logAllUnhandledErrors(createStringErrorV(EC, "foo{0}{1}{2:x}", Bar, 1, 0xff),
+ S);
+ EXPECT_EQ(S.str(), "foobar10xff\n")
+ << "Unexpected createStringErrorV() log result";
+
+ S.flush();
+ Msg.clear();
+ auto Res = errorToErrorCode(createStringErrorV(EC, "foo{0}", Bar));
+ EXPECT_EQ(Res, EC)
+ << "Failed to convert createStringErrorV() result to error_code.";
+}
+
// Test that the ExitOnError utility works as expected.
TEST(ErrorDeathTest, ExitOnError) {
ExitOnError ExitOnErr;