View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000827 | OpenMPT | libopenmpt | public | 2016-07-06 18:59 | 2016-07-12 09:38 |
Reporter | manx | Assigned To | manx | ||
Priority | high | Severity | major | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | OpenMPT 1.26.02.* (old testing) | ||||
Target Version | OpenMPT 1.?? (libopenmpt 1.0) (goals) | Fixed in Version | OpenMPT 1.26.03.03 / libopenmpt 0.2-beta19 (upgrade first) | ||
Summary | 0000827: Use of throw() in public libopenmpt C++ header is deprecated | ||||
Description | throw() exception specification is deprecated since C++11, but required to be used for C++98 and C++03. Newer compilers will probably start to warn about this starting with about C++17 (I'm guessing here). Our public header file should not trigger such trivial warnings. Since C++11, noexcept is the equivalent, and recommended as alternative to throw(). Possible solution: | ||||
Additional Information | This may be required to be solved even before libopenmpt 1.0. | ||||
Tags | No tags attached. | ||||
Attached Files | noexcept-v1.patch (2,375 bytes)
Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 6595) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -117,9 +117,9 @@ private: char * text; public: - exception( const std::string & text ) throw(); - virtual ~exception() throw(); - virtual const char * what() const throw(); + exception( const std::string & text ) LIBOPENMPT_NOEXCEPT; + virtual ~exception() LIBOPENMPT_NOEXCEPT; + virtual const char * what() const LIBOPENMPT_NOEXCEPT; }; // class exception //! Get the libopenmpt version number Index: libopenmpt/libopenmpt_config.h =================================================================== --- libopenmpt/libopenmpt_config.h (revision 6595) +++ libopenmpt/libopenmpt_config.h (working copy) @@ -178,6 +178,28 @@ #endif #endif +#ifdef __cplusplus +#if defined(LIBOPENMPT_FORCE_NOEXCEPT_CXX98) +#define LIBOPENMPT_NOEXCEPT throw() +#elif defined(IBOPENMPT_FORCE_NOEXCEPT_CXX03) +#define LIBOPENMPT_NOEXCEPT throw() +#elif defined(IBOPENMPT_FORCE_NOEXCEPT_CXX11) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif defined(IBOPENMPT_FORCE_NOEXCEPT_CXX14) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif defined(IBOPENMPT_FORCE_NOEXCEPT_CXX17) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif (__cplusplus >= 201402L) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif (__cplusplus >= 201103L) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif (__cplusplus >= 199711L) +#define LIBOPENMPT_NOEXCEPT throw() +#else +#define LIBOPENMPT_NOEXCEPT throw() +#endif +#endif + #include "libopenmpt_version.h" #endif /* LIBOPENMPT_CONFIG_H */ Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 6595) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -21,7 +21,7 @@ namespace openmpt { -exception::exception( const std::string & text ) throw() +exception::exception( const std::string & text ) LIBOPENMPT_NOEXCEPT : std::exception() , text(0) { @@ -31,7 +31,7 @@ } } -exception::~exception() throw() { +exception::~exception() LIBOPENMPT_NOEXCEPT { if ( text ) { std::free( text ); text = 0; @@ -38,7 +38,7 @@ } } -const char * exception::what() const throw() { +const char * exception::what() const LIBOPENMPT_NOEXCEPT { if ( text ) { return text; } else { noexcept-v2.patch (2,379 bytes)
Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 6603) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -117,9 +117,9 @@ private: char * text; public: - exception( const std::string & text ) throw(); - virtual ~exception() throw(); - virtual const char * what() const throw(); + exception( const std::string & text ) LIBOPENMPT_NOEXCEPT; + virtual ~exception() LIBOPENMPT_NOEXCEPT; + virtual const char * what() const LIBOPENMPT_NOEXCEPT; }; // class exception //! Get the libopenmpt version number Index: libopenmpt/libopenmpt_config.h =================================================================== --- libopenmpt/libopenmpt_config.h (revision 6603) +++ libopenmpt/libopenmpt_config.h (working copy) @@ -178,6 +178,28 @@ #endif #endif +#ifdef __cplusplus +#if defined(LIBOPENMPT_FORCE_NOEXCEPT_CXX98) +#define LIBOPENMPT_NOEXCEPT throw() +#elif defined(LIBOPENMPT_FORCE_NOEXCEPT_CXX03) +#define LIBOPENMPT_NOEXCEPT throw() +#elif defined(LIBOPENMPT_FORCE_NOEXCEPT_CXX11) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif defined(LIBOPENMPT_FORCE_NOEXCEPT_CXX14) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif defined(LIBOPENMPT_FORCE_NOEXCEPT_CXX17) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif (__cplusplus >= 201402L) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif (__cplusplus >= 201103L) +#define LIBOPENMPT_NOEXCEPT noexcept +#elif (__cplusplus >= 199711L) +#define LIBOPENMPT_NOEXCEPT throw() +#else +#define LIBOPENMPT_NOEXCEPT throw() +#endif +#endif + #include "libopenmpt_version.h" #endif /* LIBOPENMPT_CONFIG_H */ Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 6603) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -21,7 +21,7 @@ namespace openmpt { -exception::exception( const std::string & text ) throw() +exception::exception( const std::string & text ) LIBOPENMPT_NOEXCEPT : std::exception() , text(0) { @@ -31,7 +31,7 @@ } } -exception::~exception() throw() { +exception::~exception() LIBOPENMPT_NOEXCEPT { if ( text ) { std::free( text ); text = 0; @@ -38,7 +38,7 @@ } } -const char * exception::what() const throw() { +const char * exception::what() const LIBOPENMPT_NOEXCEPT { if ( text ) { return text; } else { noexcept-v3.patch (3,455 bytes)
Index: libopenmpt/dox/changelog.md =================================================================== --- libopenmpt/dox/changelog.md (revision 6617) +++ libopenmpt/dox/changelog.md (working copy) @@ -9,6 +9,11 @@ * [**Change**] libopenmpt now uses C++14 `[[deprecated]]` attribute instead of compiler-specific solutions when appropriate. + * [**Change**] libopenmpt C++ header now uses C++11 `noexcept` instead of + C++98 `throw()` exception specification when supported. `throw()` is + deprecated since C++11. This does not change API or ABI as they are + equivalent. Use `LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT` to override the + default. * The public libopenmpt C++ header has auto-detection logics for the used C++ standard now. I case your client code compiler misreports the standard Index: libopenmpt/libopenmpt.hpp =================================================================== --- libopenmpt/libopenmpt.hpp (revision 6617) +++ libopenmpt/libopenmpt.hpp (working copy) @@ -130,9 +130,9 @@ private: char * text; public: - exception( const std::string & text ) throw(); - virtual ~exception() throw(); - virtual const char * what() const throw(); + exception( const std::string & text ) LIBOPENMPT_NOEXCEPT; + virtual ~exception() LIBOPENMPT_NOEXCEPT; + virtual const char * what() const LIBOPENMPT_NOEXCEPT; }; // class exception //! Get the libopenmpt version number Index: libopenmpt/libopenmpt_config.h =================================================================== --- libopenmpt/libopenmpt_config.h (revision 6617) +++ libopenmpt/libopenmpt_config.h (working copy) @@ -112,11 +112,18 @@ /* handle known broken compilers here by defining LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED appropriately */ #endif +#ifndef LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT +/* handle known broken compilers here by defining LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT appropriately */ +#endif + #if defined(LIBOPENMPT_ASSUME_CPLUSPLUS) #ifndef LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED #define LIBOPENMPT_ASSUME_CPLUSPLUS_DEPRECATED LIBOPENMPT_ASSUME_CPLUSPLUS #endif +#ifndef LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT +#define LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT LIBOPENMPT_ASSUME_CPLUSPLUS #endif +#endif #endif @@ -212,6 +219,20 @@ #endif #endif +#ifdef __cplusplus +#if defined(LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT) +#if (LIBOPENMPT_ASSUME_CPLUSPLUS_NOEXCEPT >= 201103L) +#define LIBOPENMPT_NOEXCEPT noexcept +#else +#define LIBOPENMPT_NOEXCEPT throw() +#endif +#elif (__cplusplus >= 201103L) +#define LIBOPENMPT_NOEXCEPT noexcept +#else +#define LIBOPENMPT_NOEXCEPT throw() +#endif +#endif + #include "libopenmpt_version.h" #endif /* LIBOPENMPT_CONFIG_H */ Index: libopenmpt/libopenmpt_cxx.cpp =================================================================== --- libopenmpt/libopenmpt_cxx.cpp (revision 6617) +++ libopenmpt/libopenmpt_cxx.cpp (working copy) @@ -21,7 +21,7 @@ namespace openmpt { -exception::exception( const std::string & text ) throw() +exception::exception( const std::string & text ) LIBOPENMPT_NOEXCEPT : std::exception() , text(0) { @@ -31,7 +31,7 @@ } } -exception::~exception() throw() { +exception::~exception() LIBOPENMPT_NOEXCEPT { if ( text ) { std::free( text ); text = 0; @@ -38,7 +38,7 @@ } } -const char * exception::what() const throw() { +const char * exception::what() const LIBOPENMPT_NOEXCEPT { if ( text ) { return text; } else { | ||||
Has the bug occurred in previous versions? | yes | ||||
Tested code revision (in case you know it) | |||||
Date Modified | Username | Field | Change |
---|---|---|---|
2016-07-06 18:59 | manx | New Issue | |
2016-07-06 18:59 | manx | Status | new => assigned |
2016-07-06 18:59 | manx | Assigned To | => manx |
2016-07-08 08:40 | manx | File Added: noexcept-v1.patch | |
2016-07-08 21:05 | manx | File Added: noexcept-v2.patch | |
2016-07-12 09:30 | manx | File Added: noexcept-v3.patch | |
2016-07-12 09:38 | manx | Status | assigned => resolved |
2016-07-12 09:38 | manx | Resolution | open => fixed |
2016-07-12 09:38 | manx | Fixed in Version | => OpenMPT 1.26.03.03 / libopenmpt 0.2-beta19 (upgrade first) |
2016-07-12 09:38 | manx | Note Added: 0002509 |