[PATCH] D51490: [Error] Fix template deduction in createFileError
Alexandre Ganea via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 7 06:17:19 PDT 2018
aganea added inline comments.
================
Comment at: include/llvm/Support/Error.h:1210-1216
+template <class Err, typename = typename std::enable_if<
+ std::is_base_of<Error, Err>::value &&
+ !std::is_base_of<ErrorSuccess, Err>::value,
+ Err>::type>
inline Error createFileError(std::string F, Err E) {
return FileError::build(F, std::move(E));
}
----------------
ilya-biryukov wrote:
> zturner wrote:
> > What if you just write:
> >
> > `Error createFileError(std::string F, ErrorSuccess) = delete;`
> >
> > Does that also solve the problem?
> I think this won't work if we want it to work for descendants of ErorrSucces. The reason is that the template would still be preferred for the derived classes, e.g.
>
> ```
> class MyErrorSuccess : public ErrorSuccess {
> ///...
> };
>
> void test() {
> createFile("foo", MyErrorSuccess()); // <-- chooses a template, not `=delete`d function.
> }
> ```
>
> The reason is that the non-template overload needs a derived-to-base conversion for the second arg, so it's considered "worse" than the template one for the purpose of the overloading.
>
> Haven't checked with the compiler, though.
If using the `= delete` suggestion, `createFileError("file.bin", ErrorSuccess())` fails with:
```
1>F:\svn\llvm\unittests\Support\ErrorTest.cpp(878): error : call to deleted function 'createFileError'
1>F:\svn\llvm\include\llvm/Support/Error.h(1217): note: candidate function has been explicitly deleted
1>F:\svn\llvm\include\llvm/Support/Error.h(1213): note: candidate function [with Err = llvm::ErrorSuccess]
```
However, `createFileError("file.bin", MyErrorSuccess())` is fine.
The constructor to `Expected` has the same issue. It would fail with `ErrorSuccess`, but not with `MyErrorSuccess`.
We could make `ErrorSucess` `final`? Is it really desirable to have several ways of succeeding?
Repository:
rL LLVM
https://reviews.llvm.org/D51490
More information about the llvm-commits
mailing list