OSDN Git Service

[Error] Reintroduce type validation in createFileError()
authorAlexandre Ganea <alexandre.ganea@ubisoft.com>
Fri, 7 Sep 2018 18:32:59 +0000 (18:32 +0000)
committerAlexandre Ganea <alexandre.ganea@ubisoft.com>
Fri, 7 Sep 2018 18:32:59 +0000 (18:32 +0000)
This prevents from using ErrorSuccess as an argument to createFileError().

Differential Revision: https://reviews.llvm.org/D51490

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@341689 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Error.h
unittests/Support/ErrorTest.cpp

index 3ee59b9..4e16190 100644 (file)
@@ -322,7 +322,7 @@ private:
 /// Subclass of Error for the sole purpose of identifying the success path in
 /// the type system. This allows to catch invalid conversion to Expected<T> at
 /// compile time.
-class ErrorSuccess : public Error {};
+class ErrorSuccess final : public Error {};
 
 inline ErrorSuccess Error::success() { return ErrorSuccess(); }
 
@@ -1171,8 +1171,7 @@ Error createStringError(std::error_code EC, char const *Msg);
 /// show more detailed information to the user.
 class FileError final : public ErrorInfo<FileError> {
 
-  template <class Err>
-  friend Error createFileError(std::string, Err);
+  friend Error createFileError(std::string, Error);
 
 public:
   void log(raw_ostream &OS) const override {
@@ -1207,11 +1206,12 @@ private:
 
 /// Concatenate a source file path and/or name with an Error. The resulting
 /// Error is unchecked.
-template <class Err>
-inline Error createFileError(std::string F, Err E) {
+inline Error createFileError(std::string F, Error E) {
   return FileError::build(F, std::move(E));
 }
 
+Error createFileError(std::string F, ErrorSuccess) = delete;
+
 /// Helper for check-and-exit error handling.
 ///
 /// For tool use only. NOT FOR USE IN LIBRARY CODE.
index 2510289..ed1e2bb 100644 (file)
@@ -874,6 +874,9 @@ TEST(Error, FileErrorTest) {
       },
       "");
 #endif
+  // Not allowed, would fail at compile-time
+  //consumeError(createFileError("file.bin", ErrorSuccess()));
+
   Error E1 = make_error<CustomError>(1);
   Error FE1 = createFileError("file.bin", std::move(E1));
   EXPECT_EQ(toString(std::move(FE1)).compare("'file.bin': CustomError {1}"), 0);