style: clang-tidy: default checks and fix bug in iostream deconstruction

```
/pybind11/include/pybind11/iostream.h:71:9: warning: Call to virtual method 'pythonbuf::sync' during destruction bypasses virtual dispatch [clang-analyzer-optin.cplusplus.VirtualCall]
        sync();
        ^
/pybind11/tests/test_iostream.cpp:72:5: note: Calling '~scoped_ostream_redirect'
    });
```
This commit is contained in:
Henry Schreiner 2020-09-12 08:26:35 -04:00 committed by Henry Schreiner
parent 4d78640830
commit e7bafc8ec1
2 changed files with 9 additions and 3 deletions

View File

@ -1,7 +1,6 @@
FormatStyle: file FormatStyle: file
Checks: ' Checks: '
-*,
llvm-namespace-comment, llvm-namespace-comment,
modernize-use-override, modernize-use-override,
readability-container-size-empty, readability-container-size-empty,

View File

@ -38,7 +38,10 @@ private:
return sync() == 0 ? traits_type::not_eof(c) : traits_type::eof(); return sync() == 0 ? traits_type::not_eof(c) : traits_type::eof();
} }
int sync() override { // This function must be non-virtual to be called in a destructor. If the
// rare MSVC test failure shows up with this version, then this should be
// simplified to a fully qualified call.
int _sync() {
if (pbase() != pptr()) { if (pbase() != pptr()) {
// This subtraction cannot be negative, so dropping the sign // This subtraction cannot be negative, so dropping the sign
str line(pbase(), static_cast<size_t>(pptr() - pbase())); str line(pbase(), static_cast<size_t>(pptr() - pbase()));
@ -54,6 +57,10 @@ private:
return 0; return 0;
} }
int sync() override {
return _sync();
}
public: public:
pythonbuf(object pyostream, size_t buffer_size = 1024) pythonbuf(object pyostream, size_t buffer_size = 1024)
@ -68,7 +75,7 @@ public:
/// Sync before destroy /// Sync before destroy
~pythonbuf() override { ~pythonbuf() override {
sync(); _sync();
} }
}; };