diff options
author | Alex Langford <alangford@apple.com> | 2024-02-16 16:26:14 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-16 16:26:14 -0800 |
commit | 4bb0ca655bb65aae0a1d251ba5053aadff678101 (patch) | |
tree | 41c63dd505c494cd7b99d5ece74b637e9192c5bd /llvm/unittests/Support/ErrorTest.cpp | |
parent | 3d67cf681a728e4cf0ab9947c0dd07539dda8b74 (diff) | |
download | llvm-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.cpp | 17 |
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; |