From e7bafc8ec1b8d9b438c15bc1b28566a9476918fe Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Sat, 12 Sep 2020 08:26:35 -0400 Subject: [PATCH] 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' }); ``` --- .clang-tidy | 1 - include/pybind11/iostream.h | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index a4eab6ad8..e29d92989 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,7 +1,6 @@ FormatStyle: file Checks: ' --*, llvm-namespace-comment, modernize-use-override, readability-container-size-empty, diff --git a/include/pybind11/iostream.h b/include/pybind11/iostream.h index 4b4042b06..48479f2d1 100644 --- a/include/pybind11/iostream.h +++ b/include/pybind11/iostream.h @@ -38,7 +38,10 @@ private: 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()) { // This subtraction cannot be negative, so dropping the sign str line(pbase(), static_cast(pptr() - pbase())); @@ -54,6 +57,10 @@ private: return 0; } + int sync() override { + return _sync(); + } + public: pythonbuf(object pyostream, size_t buffer_size = 1024) @@ -68,7 +75,7 @@ public: /// Sync before destroy ~pythonbuf() override { - sync(); + _sync(); } };