mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:29:58 +00:00
[Support] Add a free toString function for Error
toString() consumes an Error and returns a string representation of its contents. This commit also adds a message() method to ErrorInfoBase for convenience. Differential Revision: http://reviews.llvm.org/D19883 llvm-svn: 268465
This commit is contained in:
parent
38c4440a35
commit
a650a4c26e
@ -16,6 +16,7 @@
|
||||
|
||||
#include "llvm/ADT/PointerIntPair.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorOr.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -35,6 +36,14 @@ public:
|
||||
/// Print an error message to an output stream.
|
||||
virtual void log(raw_ostream &OS) const = 0;
|
||||
|
||||
/// Return the error message as a string.
|
||||
virtual std::string message() const {
|
||||
std::string Msg;
|
||||
raw_string_ostream OS(Msg);
|
||||
log(OS);
|
||||
return Msg;
|
||||
}
|
||||
|
||||
/// Convert this error to a std::error_code.
|
||||
///
|
||||
/// This is a temporary crutch to enable interaction with code still
|
||||
@ -537,6 +546,16 @@ inline void logAllUnhandledErrors(Error E, raw_ostream &OS,
|
||||
});
|
||||
}
|
||||
|
||||
/// Write all error messages (if any) in E to a string. The newline character
|
||||
/// is used to separate error messages.
|
||||
inline std::string toString(Error E) {
|
||||
SmallVector<std::string, 2> Errors;
|
||||
handleAllErrors(std::move(E), [&Errors](const ErrorInfoBase &EI) {
|
||||
Errors.push_back(EI.message());
|
||||
});
|
||||
return join(Errors.begin(), Errors.end(), "\n");
|
||||
}
|
||||
|
||||
/// Consume a Error without doing anything. This method should be used
|
||||
/// only where an error can be considered a reasonable and expected return
|
||||
/// value.
|
||||
|
@ -544,4 +544,23 @@ TEST(Error, ErrorCodeConversions) {
|
||||
}
|
||||
}
|
||||
|
||||
// Test that error messages work.
|
||||
TEST(Error, ErrorMessage) {
|
||||
EXPECT_EQ(toString(Error::success()).compare(""), 0);
|
||||
|
||||
Error E1 = make_error<CustomError>(0);
|
||||
EXPECT_EQ(toString(std::move(E1)).compare("CustomError { 0}"), 0);
|
||||
|
||||
Error E2 = make_error<CustomError>(0);
|
||||
handleAllErrors(std::move(E2), [](const CustomError &CE) {
|
||||
EXPECT_EQ(CE.message().compare("CustomError { 0}"), 0);
|
||||
});
|
||||
|
||||
Error E3 = joinErrors(make_error<CustomError>(0), make_error<CustomError>(1));
|
||||
EXPECT_EQ(toString(std::move(E3))
|
||||
.compare("CustomError { 0}\n"
|
||||
"CustomError { 1}"),
|
||||
0);
|
||||
}
|
||||
|
||||
} // end anon namespace
|
||||
|
Loading…
Reference in New Issue
Block a user