[PATCH] D19901: [ProfileData] (llvm) Use Error in InstrProf and Coverage
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Fri May 6 14:26:12 PDT 2016
lhames added inline comments.
================
Comment at: include/llvm/ProfileData/InstrProf.h:303-321
@@ -282,5 +302,21 @@
-inline std::error_code make_error_code(instrprof_error E) {
- return std::error_code(static_cast<int>(E), instrprof_category());
-}
+class InstrProfError : public EnumBasedError<instrprof_error, InstrProfError> {
+public:
+ InstrProfError(instrprof_error Err)
+ : EnumBasedError<instrprof_error, InstrProfError>(Err) {}
+
+ void log(raw_ostream &OS) const override;
+
+ std::string message() const override;
+
+ /// Consume an Error and return the raw enum value contained within it. The
+ /// Error must either be a success value, or contain a single InstrProfError.
+ static instrprof_error take(Error E) {
+ auto Err = instrprof_error::success;
+ handleAllErrors(std::move(E), [&Err](const InstrProfError &IPE) {
+ assert(Err == instrprof_error::success && "Multiple errors encountered");
+ Err = IPE.get();
+ });
+ return Err;
+ }
----------------
davidxl wrote:
> vsk wrote:
> > lhames wrote:
> > > InstrProfError (and CoverageMappingError) need their own ID members. If they don't have them the Error RTTI will treat them both as EnumBasedErrors.
> > Yikes! Is this true even if I define distinct ID's for them? Specifically:
> >
> > ```
> > template <> char EnumBasedError<instrprof_error, InstrProfError>::ID = 0; // InstrProf.cpp
> > template <> char EnumBasedError<coveragemap_error, CoverageMapError>::ID = 0; // CoverageMapping.cpp
> > ```
> Can you elaborate on the RTTI issue? Also what is the problem that can be caused with this (both Error treated as EnumBasedErrors)?
My bad! didn't stop to think about EnumBasedError being templated. I think having the ID on EnumBasedError like this should be safe.
http://reviews.llvm.org/D19901
More information about the llvm-commits
mailing list