summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/docs/ProgrammersManual.rst3
-rw-r--r--llvm/include/llvm/Support/Error.h14
-rw-r--r--llvm/lib/Support/Error.cpp5
-rw-r--r--llvm/unittests/Support/ErrorTest.cpp13
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;
OpenPOWER on IntegriCloud