| From b79d478c21ed6af20554ead97da72de845dc3206 Mon Sep 17 00:00:00 2001 |
| From: Peter Korsgaard <peter@korsgaard.com> |
| Date: Sat, 25 Feb 2017 21:57:19 +0100 |
| Subject: [PATCH] Fix build with gcc 6 |
| |
| Gcc 6.x defaults to C++14, and the iostream operator bool behaviour changed |
| in C++11. In previous versions, a somewhat odd operator void* was used to |
| return the status of the stream as a pointer. Since C++11 a more sensible |
| operator bool is used to return the stream staus. |
| |
| For details, see: |
| |
| http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool |
| |
| The code in CConfigReadContext assumes the pre-C++11 behaviour and provides |
| its own operator void overload to return the status of the embedded |
| iostream. With C++11, iostream no longer provides this overload, breaking |
| the build: |
| |
| CConfig.cpp: In member function 'CConfigReadContext::operator void*() const': |
| CConfig.cpp:1851:9: error: cannot convert 'std::istream {aka std::basic_istream<char>}' to 'void*' in return |
| return m_stream; |
| |
| To fix it, backport part of upstream commit 3d963bfbe7897d0a33ad (possible |
| fix for mavericks) which changes the code to simply provide a getStream() |
| method which returns a reference to the embedded stream and the calling code |
| is changed to use operator bool on the returned stream, making the code |
| compatible with both old and new compilers. |
| |
| This upstream commit is part of the 1.6.0 release, so can be dropped when |
| the version is bumped. |
| |
| Signed-off-by: Peter Korsgaard <peter@korsgaard.com> |
| --- |
| lib/server/CConfig.cpp | 7 +------ |
| lib/server/CConfig.h | 2 +- |
| 2 files changed, 2 insertions(+), 7 deletions(-) |
| |
| diff --git a/lib/server/CConfig.cpp b/lib/server/CConfig.cpp |
| index a502fe78..d67dde20 100644 |
| --- a/lib/server/CConfig.cpp |
| +++ b/lib/server/CConfig.cpp |
| @@ -607,7 +607,7 @@ void |
| CConfig::read(CConfigReadContext& context) |
| { |
| CConfig tmp; |
| - while (context) { |
| + while (context.getStream()) { |
| tmp.readSection(context); |
| } |
| *this = tmp; |
| @@ -1846,11 +1846,6 @@ CConfigReadContext::getLineNumber() const |
| return m_line; |
| } |
| |
| -CConfigReadContext::operator void*() const |
| -{ |
| - return m_stream; |
| -} |
| - |
| bool |
| CConfigReadContext::operator!() const |
| { |
| diff --git a/lib/server/CConfig.h b/lib/server/CConfig.h |
| index c0d2faa8..0ee453cb 100644 |
| --- a/lib/server/CConfig.h |
| +++ b/lib/server/CConfig.h |
| @@ -480,7 +480,6 @@ public: |
| bool readLine(CString&); |
| UInt32 getLineNumber() const; |
| |
| - operator void*() const; |
| bool operator!() const; |
| |
| OptionValue parseBoolean(const CString&) const; |
| @@ -502,6 +501,7 @@ public: |
| IPlatformScreen::CButtonInfo* |
| parseMouse(const CString& mouse) const; |
| KeyModifierMask parseModifier(const CString& modifiers) const; |
| + std::istream& getStream() const { return m_stream; }; |
| |
| private: |
| // not implemented |
| -- |
| 2.11.0 |
| |