diff --git a/NEWS b/NEWS index 3443e503f..14676a5a7 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ ver 0.19.8 (not yet released) * decoder - dsdiff, dsf: allow ID3 tags larger than 4 kB - ffmpeg: support interleaved floating point +* fix clang 3.6 warnings ver 0.19.7 (2014/12/17) * input @@ -168,6 +169,9 @@ ver 0.19 (2014/10/10) * install systemd unit for socket activation * Android port +ver 0.18.22 (not yet released) +* fix clang 3.6 warnings + ver 0.18.21 (2014/12/17) * playlist - embcue: fix filename suffix detection diff --git a/src/Compiler.h b/src/Compiler.h index 44a87c7ba..fea971526 100644 --- a/src/Compiler.h +++ b/src/Compiler.h @@ -20,33 +20,45 @@ #ifndef COMPILER_H #define COMPILER_H -#define GCC_CHECK_VERSION(major, minor) \ - (defined(__GNUC__) && \ - (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))) +#define GCC_MAKE_VERSION(major, minor, patchlevel) ((major) * 10000 + (minor) * 100 + patchlevel) #ifdef __GNUC__ -#define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) +#define GCC_VERSION GCC_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) #else #define GCC_VERSION 0 #endif +#define GCC_CHECK_VERSION(major, minor) \ + (defined(__GNUC__) && GCC_VERSION >= GCC_MAKE_VERSION(major, minor, 0)) + +/** + * Are we building with gcc (not clang or any other compiler) and a + * version older than the specified one? + */ +#define GCC_OLDER_THAN(major, minor) \ + (defined(__GNUC__) && !defined(__clang__) && \ + GCC_VERSION < GCC_MAKE_VERSION(major, minor, 0)) + #ifdef __clang__ -# define CLANG_VERSION (__clang_major__ * 10000 \ - + __clang_minor__ * 100 \ - + __clang_patchlevel__) +# define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__) # if __clang_major__ < 3 # error Sorry, your clang version is too old. You need at least version 3.1. # endif #elif defined(__GNUC__) -# if !GCC_CHECK_VERSION(4,6) +# if GCC_OLDER_THAN(4,6) # error Sorry, your gcc version is too old. You need at least version 4.6. # endif #else # warning Untested compiler. Use at your own risk! #endif +/** + * Are we building with the specified version of clang or newer? + */ +#define CLANG_CHECK_VERSION(major, minor) \ + (defined(__clang__) && \ + CLANG_VERSION >= GCC_MAKE_VERSION(major, minor, 0)) + #if GCC_CHECK_VERSION(4,0) /* GCC 4.x */ @@ -141,7 +153,7 @@ #if defined(__cplusplus) /* support for C++11 "override" was added in gcc 4.7 */ -#if !defined(__clang__) && !GCC_CHECK_VERSION(4,7) +#if GCC_OLDER_THAN(4,7) #define override #define final #endif diff --git a/src/SongFilter.cxx b/src/SongFilter.cxx index 794cb9208..dc0a63df3 100644 --- a/src/SongFilter.cxx +++ b/src/SongFilter.cxx @@ -77,7 +77,10 @@ SongFilter::Item::Item(unsigned _tag, time_t _time) bool SongFilter::Item::StringMatch(const char *s) const { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(s != nullptr); +#endif if (fold_case) { const std::string folded = IcuCaseFold(s); diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx index fba72210d..5fd224bb5 100644 --- a/src/db/plugins/ProxyDatabasePlugin.cxx +++ b/src/db/plugins/ProxyDatabasePlugin.cxx @@ -103,7 +103,7 @@ public: virtual void Close() override; virtual const LightSong *GetSong(const char *uri_utf8, Error &error) const override; - virtual void ReturnSong(const LightSong *song) const; + void ReturnSong(const LightSong *song) const override; virtual bool Visit(const DatabaseSelection &selection, VisitDirectory visit_directory, @@ -731,7 +731,7 @@ ProxyDatabase::Visit(const DatabaseSelection &selection, { // TODO: eliminate the const_cast if (!const_cast(this)->EnsureConnected(error)) - return nullptr; + return false; if (!visit_directory && !visit_playlist && selection.recursive && (ServerSupportsSearchBase(connection) @@ -757,7 +757,7 @@ ProxyDatabase::VisitUniqueTags(const DatabaseSelection &selection, { // TODO: eliminate the const_cast if (!const_cast(this)->EnsureConnected(error)) - return nullptr; + return false; enum mpd_tag_type tag_type2 = Convert(tag_type); if (tag_type2 == MPD_TAG_COUNT) { @@ -810,7 +810,7 @@ ProxyDatabase::GetStats(const DatabaseSelection &selection, // TODO: eliminate the const_cast if (!const_cast(this)->EnsureConnected(error)) - return nullptr; + return false; struct mpd_stats *stats2 = mpd_run_stats(connection); diff --git a/src/db/plugins/simple/SimpleDatabasePlugin.hxx b/src/db/plugins/simple/SimpleDatabasePlugin.hxx index 7ba71e272..d82225f8c 100644 --- a/src/db/plugins/simple/SimpleDatabasePlugin.hxx +++ b/src/db/plugins/simple/SimpleDatabasePlugin.hxx @@ -110,9 +110,9 @@ public: virtual bool Open(Error &error) override; virtual void Close() override; - virtual const LightSong *GetSong(const char *uri_utf8, - Error &error) const override; - virtual void ReturnSong(const LightSong *song) const; + const LightSong *GetSong(const char *uri_utf8, + Error &error) const override; + void ReturnSong(const LightSong *song) const override; virtual bool Visit(const DatabaseSelection &selection, VisitDirectory visit_directory, diff --git a/src/decoder/DecoderPlugin.cxx b/src/decoder/DecoderPlugin.cxx index 3be812c3b..a0722c348 100644 --- a/src/decoder/DecoderPlugin.cxx +++ b/src/decoder/DecoderPlugin.cxx @@ -26,7 +26,10 @@ bool DecoderPlugin::SupportsSuffix(const char *suffix) const { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(suffix != nullptr); +#endif return suffixes != nullptr && string_array_contains(suffixes, suffix); @@ -35,7 +38,10 @@ DecoderPlugin::SupportsSuffix(const char *suffix) const bool DecoderPlugin::SupportsMimeType(const char *mime_type) const { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(mime_type != nullptr); +#endif return mime_types != nullptr && string_array_contains(mime_types, mime_type); diff --git a/src/filter/plugins/ChainFilterPlugin.cxx b/src/filter/plugins/ChainFilterPlugin.cxx index 7342beb14..4aeee69af 100644 --- a/src/filter/plugins/ChainFilterPlugin.cxx +++ b/src/filter/plugins/ChainFilterPlugin.cxx @@ -53,10 +53,11 @@ public: children.emplace_back(name, filter); } - virtual AudioFormat Open(AudioFormat &af, Error &error) override; - virtual void Close(); - virtual ConstBuffer FilterPCM(ConstBuffer src, - Error &error); + /* virtual methods from class Filter */ + AudioFormat Open(AudioFormat &af, Error &error) override; + void Close() override; + ConstBuffer FilterPCM(ConstBuffer src, + Error &error) override; private: /** diff --git a/src/filter/plugins/NormalizeFilterPlugin.cxx b/src/filter/plugins/NormalizeFilterPlugin.cxx index a69df2b81..372ab53ac 100644 --- a/src/filter/plugins/NormalizeFilterPlugin.cxx +++ b/src/filter/plugins/NormalizeFilterPlugin.cxx @@ -34,10 +34,11 @@ class NormalizeFilter final : public Filter { PcmBuffer buffer; public: - virtual AudioFormat Open(AudioFormat &af, Error &error) override; - virtual void Close(); - virtual ConstBuffer FilterPCM(ConstBuffer src, - Error &error) override; + /* virtual methods from class Filter */ + AudioFormat Open(AudioFormat &af, Error &error) override; + void Close() override; + ConstBuffer FilterPCM(ConstBuffer src, + Error &error) override; }; static Filter * diff --git a/src/filter/plugins/ReplayGainFilterPlugin.cxx b/src/filter/plugins/ReplayGainFilterPlugin.cxx index 651352ac9..f76e48e37 100644 --- a/src/filter/plugins/ReplayGainFilterPlugin.cxx +++ b/src/filter/plugins/ReplayGainFilterPlugin.cxx @@ -112,10 +112,11 @@ public: */ void Update(); - virtual AudioFormat Open(AudioFormat &af, Error &error) override; - virtual void Close(); - virtual ConstBuffer FilterPCM(ConstBuffer src, - Error &error) override; + /* virtual methods from class Filter */ + AudioFormat Open(AudioFormat &af, Error &error) override; + void Close() override; + ConstBuffer FilterPCM(ConstBuffer src, + Error &error) override; }; void diff --git a/src/filter/plugins/RouteFilterPlugin.cxx b/src/filter/plugins/RouteFilterPlugin.cxx index a252af97d..4094119f2 100644 --- a/src/filter/plugins/RouteFilterPlugin.cxx +++ b/src/filter/plugins/RouteFilterPlugin.cxx @@ -120,10 +120,11 @@ public: */ bool Configure(const config_param ¶m, Error &error); - virtual AudioFormat Open(AudioFormat &af, Error &error) override; - virtual void Close(); - virtual ConstBuffer FilterPCM(ConstBuffer src, - Error &error) override; + /* virtual methods from class Filter */ + AudioFormat Open(AudioFormat &af, Error &error) override; + void Close() override; + ConstBuffer FilterPCM(ConstBuffer src, + Error &error) override; }; bool diff --git a/src/filter/plugins/VolumeFilterPlugin.cxx b/src/filter/plugins/VolumeFilterPlugin.cxx index 7b6ccc51e..17e061476 100644 --- a/src/filter/plugins/VolumeFilterPlugin.cxx +++ b/src/filter/plugins/VolumeFilterPlugin.cxx @@ -43,10 +43,11 @@ public: pv.SetVolume(_volume); } - virtual AudioFormat Open(AudioFormat &af, Error &error) override; - virtual void Close(); - virtual ConstBuffer FilterPCM(ConstBuffer src, - Error &error) override; + /* virtual methods from class Filter */ + AudioFormat Open(AudioFormat &af, Error &error) override; + void Close() override; + ConstBuffer FilterPCM(ConstBuffer src, + Error &error) override; }; static constexpr Domain volume_domain("pcm_volume"); diff --git a/src/fs/Charset.cxx b/src/fs/Charset.cxx index abf4d8287..c634c9340 100644 --- a/src/fs/Charset.cxx +++ b/src/fs/Charset.cxx @@ -103,7 +103,10 @@ static inline void FixSeparators(std::string &s) std::string PathToUTF8(const char *path_fs) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(path_fs != nullptr); +#endif #ifdef HAVE_GLIB if (fs_charset.empty()) { @@ -144,7 +147,10 @@ PathToUTF8(const char *path_fs) char * PathFromUTF8(const char *path_utf8) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(path_utf8 != nullptr); +#endif if (fs_charset.empty()) return g_strdup(path_utf8); diff --git a/src/fs/Traits.cxx b/src/fs/Traits.cxx index d62987087..166b31f4e 100644 --- a/src/fs/Traits.cxx +++ b/src/fs/Traits.cxx @@ -52,7 +52,10 @@ template typename Traits::const_pointer GetBasePathImpl(typename Traits::const_pointer p) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(p != nullptr); +#endif typename Traits::const_pointer sep = Traits::FindLastSeparator(p); return sep != nullptr @@ -64,7 +67,10 @@ template typename Traits::string GetParentPathImpl(typename Traits::const_pointer p) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(p != nullptr); +#endif typename Traits::const_pointer sep = Traits::FindLastSeparator(p); if (sep == nullptr) diff --git a/src/input/InputStream.cxx b/src/input/InputStream.cxx index f5efe8ef1..44f726a62 100644 --- a/src/input/InputStream.cxx +++ b/src/input/InputStream.cxx @@ -122,7 +122,10 @@ InputStream::IsAvailable() size_t InputStream::LockRead(void *ptr, size_t _size, Error &error) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(ptr != nullptr); +#endif assert(_size > 0); const ScopeLock protect(mutex); diff --git a/src/output/plugins/ShoutOutputPlugin.cxx b/src/output/plugins/ShoutOutputPlugin.cxx index 0341e1cf7..b51f7ed82 100644 --- a/src/output/plugins/ShoutOutputPlugin.cxx +++ b/src/output/plugins/ShoutOutputPlugin.cxx @@ -109,7 +109,7 @@ ShoutOutput::Configure(const config_param ¶m, Error &error) if (!audio_format.IsFullyDefined()) { error.Set(config_domain, "Need full audio format specification"); - return nullptr; + return false; } const char *host = require_block_string(param, "host"); diff --git a/src/tag/TagBuilder.cxx b/src/tag/TagBuilder.cxx index c9ebcd654..93518f6e9 100644 --- a/src/tag/TagBuilder.cxx +++ b/src/tag/TagBuilder.cxx @@ -182,7 +182,10 @@ TagBuilder::Complement(const Tag &other) inline void TagBuilder::AddItemInternal(TagType type, const char *value, size_t length) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(value != nullptr); +#endif assert(length > 0); auto f = FixTagString(value, length); @@ -203,7 +206,10 @@ TagBuilder::AddItemInternal(TagType type, const char *value, size_t length) void TagBuilder::AddItem(TagType type, const char *value, size_t length) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(value != nullptr); +#endif if (length == 0 || ignore_tag_items[type]) return; @@ -214,7 +220,10 @@ TagBuilder::AddItem(TagType type, const char *value, size_t length) void TagBuilder::AddItem(TagType type, const char *value) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(value != nullptr); +#endif AddItem(type, value, strlen(value)); } diff --git a/src/util/ASCII.hxx b/src/util/ASCII.hxx index 19a18a1bb..9f7147338 100644 --- a/src/util/ASCII.hxx +++ b/src/util/ASCII.hxx @@ -43,24 +43,30 @@ gcc_pure gcc_nonnull_all static inline bool StringEqualsCaseASCII(const char *a, const char *b) { - assert(a != nullptr); - assert(b != nullptr); +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ + assert(a != nullptr); + assert(b != nullptr); +#endif - /* note: strcasecmp() depends on the locale, but for ASCII-only - strings, it's safe to use */ - return strcasecmp(a, b) == 0; + /* note: strcasecmp() depends on the locale, but for ASCII-only + strings, it's safe to use */ + return strcasecmp(a, b) == 0; } gcc_pure gcc_nonnull_all static inline bool StringEqualsCaseASCII(const char *a, const char *b, size_t n) { - assert(a != nullptr); - assert(b != nullptr); +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ + assert(a != nullptr); + assert(b != nullptr); +#endif - /* note: strcasecmp() depends on the locale, but for ASCII-only - strings, it's safe to use */ - return strncasecmp(a, b, n) == 0; + /* note: strcasecmp() depends on the locale, but for ASCII-only + strings, it's safe to use */ + return strncasecmp(a, b, n) == 0; } #endif diff --git a/src/util/Manual.hxx b/src/util/Manual.hxx index baab0a555..75cffac06 100644 --- a/src/util/Manual.hxx +++ b/src/util/Manual.hxx @@ -35,7 +35,7 @@ #include #include -#if !defined(__clang__) && __GNUC__ && !GCC_CHECK_VERSION(4,8) +#if GCC_OLDER_THAN(4,8) #include #endif @@ -54,7 +54,7 @@ */ template class Manual { -#if !defined(__clang__) && __GNUC__ && !GCC_CHECK_VERSION(4,8) +#if GCC_OLDER_THAN(4,8) /* no alignas() on gcc < 4.8: apply worst-case fallback */ __attribute__((aligned(8))) #else diff --git a/src/util/UriUtil.cxx b/src/util/UriUtil.cxx index 62977e91b..54d0ded77 100644 --- a/src/util/UriUtil.cxx +++ b/src/util/UriUtil.cxx @@ -140,8 +140,11 @@ uri_remove_auth(const char *uri) bool uri_is_child(const char *parent, const char *child) { +#if !CLANG_CHECK_VERSION(3,6) + /* disabled on clang due to -Wtautological-pointer-compare */ assert(parent != nullptr); assert(child != nullptr); +#endif const size_t parent_length = strlen(parent); return memcmp(parent, child, parent_length) == 0 &&