Index: llvm/trunk/include/llvm/Support/Error.h =================================================================== --- llvm/trunk/include/llvm/Support/Error.h +++ llvm/trunk/include/llvm/Support/Error.h @@ -322,7 +322,7 @@ /// Subclass of Error for the sole purpose of identifying the success path in /// the type system. This allows to catch invalid conversion to Expected at /// compile time. -class ErrorSuccess : public Error {}; +class ErrorSuccess final : public Error {}; inline ErrorSuccess Error::success() { return ErrorSuccess(); } @@ -1171,8 +1171,7 @@ /// show more detailed information to the user. class FileError final : public ErrorInfo { - template - friend Error createFileError(std::string, Err); + friend Error createFileError(std::string, Error); public: void log(raw_ostream &OS) const override { @@ -1207,11 +1206,12 @@ /// Concatenate a source file path and/or name with an Error. The resulting /// Error is unchecked. -template -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: llvm/trunk/unittests/Support/ErrorTest.cpp =================================================================== --- llvm/trunk/unittests/Support/ErrorTest.cpp +++ llvm/trunk/unittests/Support/ErrorTest.cpp @@ -874,6 +874,9 @@ }, ""); #endif + // Not allowed, would fail at compile-time + //consumeError(createFileError("file.bin", ErrorSuccess())); + Error E1 = make_error(1); Error FE1 = createFileError("file.bin", std::move(E1)); EXPECT_EQ(toString(std::move(FE1)).compare("'file.bin': CustomError {1}"), 0);