When running dsymutil on a fat binary, we use temporary files in a small
vector of size four. When processing more than 4 architectures, this
resulted in a user-after-move, because the temporary files got moved to
the heap. Instead of storing an optional temp file, we now use a unique
pointer, so the location of the actual temp file doesn't change.
We could test this by checking in 5 binaries for 5 different
architectures, but this seems wasteful, especially since the number of
elements in the small vector is arbitrary.
llvm-svn: 362621
if (!T)
return T.takeError();
- File = llvm::Optional<sys::fs::TempFile>(std::move(*T));
+ File = llvm::make_unique<sys::fs::TempFile>(std::move(*T));
return Error::success();
}
struct ArchAndFile {
std::string Arch;
// Optional because TempFile has no default constructor.
- Optional<llvm::sys::fs::TempFile> File;
+ std::unique_ptr<llvm::sys::fs::TempFile> File;
llvm::Error createTempFile();
llvm::StringRef path() const;
ArchAndFile(StringRef Arch) : Arch(Arch) {}
ArchAndFile(ArchAndFile &&A) = default;
+ ArchAndFile &operator=(ArchAndFile &&A) = default;
~ArchAndFile();
};