diff options
-rw-r--r-- | llvm/docs/ProgrammersManual.rst | 3 | ||||
-rw-r--r-- | llvm/include/llvm/Support/Error.h | 14 | ||||
-rw-r--r-- | llvm/lib/Support/Error.cpp | 5 | ||||
-rw-r--r-- | llvm/unittests/Support/ErrorTest.cpp | 13 |
4 files changed, 22 insertions, 13 deletions
diff --git a/llvm/docs/ProgrammersManual.rst b/llvm/docs/ProgrammersManual.rst index 37792255937..32145550fe2 100644 --- a/llvm/docs/ProgrammersManual.rst +++ b/llvm/docs/ProgrammersManual.rst @@ -342,10 +342,13 @@ that inherits from the ErrorInfo utility: public: MyError(std::string Msg) : Msg(Msg) {} void log(OStream &OS) const override { OS << "MyError - " << Msg; } + static char ID; private: std::string Msg; }; + char MyError::ID = 0; // In MyError.cpp + Error bar() { if (checkErrorCondition) return make_error<MyError>("Error condition detected"); diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h index 14d7ab010b4..3eb254cbc51 100644 --- a/llvm/include/llvm/Support/Error.h +++ b/llvm/include/llvm/Support/Error.h @@ -285,15 +285,9 @@ public: return ClassID == classID() || ParentErrT::isA(ClassID); } - static const void *classID() { return &ID; } - -private: - static char ID; + static const void *classID() { return &ThisErrT::ID; } }; -template <typename ThisErrT, typename ParentErrT> -char ErrorInfo<ThisErrT, ParentErrT>::ID = 0; - /// Special ErrorInfo subclass representing a list of ErrorInfos. /// Instances of this class are constructed by joinError. class ErrorList final : public ErrorInfo<ErrorList> { @@ -317,6 +311,9 @@ public: std::error_code convertToErrorCode() const override; + // Used by ErrorInfo::classID. + static char ID; + private: ErrorList(std::unique_ptr<ErrorInfoBase> Payload1, std::unique_ptr<ErrorInfoBase> Payload2) { @@ -729,6 +726,9 @@ public: std::error_code convertToErrorCode() const override { return EC; } void log(raw_ostream &OS) const override { OS << EC.message(); } + // Used by ErrorInfo::classID. + static char ID; + protected: std::error_code EC; }; diff --git a/llvm/lib/Support/Error.cpp b/llvm/lib/Support/Error.cpp index 5bda6aae690..9007e694ec7 100644 --- a/llvm/lib/Support/Error.cpp +++ b/llvm/lib/Support/Error.cpp @@ -36,9 +36,8 @@ namespace { void ErrorInfoBase::anchor() {} char ErrorInfoBase::ID = 0; - -template <> char ErrorInfo<ErrorList>::ID = 0; -template <> char ErrorInfo<ECError>::ID = 0; +char ErrorList::ID = 0; +char ECError::ID = 0; static ManagedStatic<ErrorErrorCategory> ErrorErrorCat; diff --git a/llvm/unittests/Support/ErrorTest.cpp b/llvm/unittests/Support/ErrorTest.cpp index cf1c6e63e4d..893bd6825bf 100644 --- a/llvm/unittests/Support/ErrorTest.cpp +++ b/llvm/unittests/Support/ErrorTest.cpp @@ -35,6 +35,9 @@ public: llvm_unreachable("CustomError doesn't support ECError conversion"); } + // Used by ErrorInfo::classID. + static char ID; + protected: // This error is subclassed below, but we can't use inheriting constructors // yet, so we can't propagate the constructors through ErrorInfo. Instead @@ -45,6 +48,8 @@ protected: int Info; }; +char CustomError::ID = 0; + // Custom error class with a custom base class and some additional random // 'info'. class CustomSubError : public ErrorInfo<CustomSubError, CustomError> { @@ -66,10 +71,15 @@ public: llvm_unreachable("CustomSubError doesn't support ECError conversion"); } + // Used by ErrorInfo::classID. + static char ID; + protected: int ExtraInfo; }; +char CustomSubError::ID = 0; + static Error handleCustomError(const CustomError &CE) { return Error(); } static void handleCustomErrorVoid(const CustomError &CE) {} @@ -453,6 +463,3 @@ TEST(Error, ErrorCodeConversions) { } } // end anon namespace - -template <> char ErrorInfo<CustomError>::ID = 0; -template <> char ErrorInfo<CustomSubError, CustomError>::ID = 0; |