Compare commits

...

19 Commits

Author SHA1 Message Date
Max Kellermann
8534f2d1e2 release v0.18.22 2015-01-14 23:04:49 +01:00
Max Kellermann
665031467a db/proxy, output/shout: fix implicit nullptr/bool conversion
Return false on error, not nullptr.
2014-12-26 13:50:54 +01:00
Max Kellermann
df33171107 db/{simple,proxy}, ...: add "override" keywords
Fixes -Winconsistent-missing-override (clang 3.6).
2014-12-26 13:47:04 +01:00
Max Kellermann
53f4044890 util/{ASCII,UriUtil}, ...: work around -Wtautological-pointer-compare
New in clang 3.6.
2014-12-26 13:43:32 +01:00
Max Kellermann
a5049136ff DatabaseGlue: convert nullptr check to assertion 2014-12-26 13:43:32 +01:00
Max Kellermann
705b3c6b63 util/ASCII: fix indent 2014-12-26 13:37:38 +01:00
Max Kellermann
6b4ac66962 Compiler.h: add macro CLANG_CHECK_VERSION() 2014-12-26 13:31:03 +01:00
Max Kellermann
0964b06240 Compiler.h: add macro GCC_OLDER_THAN() 2014-12-26 13:30:44 +01:00
Max Kellermann
92eeca3ba7 util/Manual: reimplement GCC_CHECK_VERSION() using GCC_MAKE_VERSION() 2014-12-26 13:30:22 +01:00
Max Kellermann
2a86554ac4 Compiler.h: add macro GCC_MAKE_VERSION() 2014-12-26 13:30:11 +01:00
Max Kellermann
805caa30ce configure.ac: prepare for 0.18.22 2014-12-26 13:23:04 +01:00
Max Kellermann
acb798e544 release v0.18.21 2014-12-17 19:13:47 +01:00
k44
773de38bd9 playlist/embcue: fix filename suffix detection
The definition of the playlist_plugin struct member of the embcue
plugin was incorrect.
2014-12-16 18:43:05 +01:00
Max Kellermann
fa4beeee75 decoder/ffmpeg: detect and fix negative time stamps
Works around assertion failure due to something that appears to be a
(minor) FFmpeg bug.
2014-12-15 00:40:46 +01:00
Max Kellermann
d8351772d3 configure.ac: prepare for 0.18.21 2014-12-15 00:39:52 +01:00
Max Kellermann
1b5f33a435 release v0.18.20 2014-12-08 14:57:17 +01:00
Max Kellermann
41b4a63f2b decoder/ffmpeg: support FFmpeg 2.5
Version 2.5 fixed an API oddity, however it broke API compatibility,
at least with C++.  Disable the workaround when a libavformat version
is detected that is recent enough.
2014-12-08 14:25:34 +01:00
Max Kellermann
d8fc2db910 thread/Id: drop "::" prefix before pthread function names
The "::" to explicitly refer to the global namespace appeared like a
good idea in C++, but it breaks with C libraries that implement
standard functions using macros (e.g. musl).
2014-12-08 14:17:17 +01:00
Max Kellermann
dc11dea7cc configure.ac: prepare for 0.18.20 2014-12-08 14:13:20 +01:00
25 changed files with 149 additions and 61 deletions

14
NEWS
View File

@@ -1,3 +1,17 @@
ver 0.18.22 (2014/01/14)
* fix clang 3.6 warnings
ver 0.18.21 (2014/12/17)
* playlist
- embcue: fix filename suffix detection
* decoder
- ffmpeg: fix time stamp underflow
ver 0.18.20 (2014/12/08)
* decoder
- ffmpeg: support FFmpeg 2.5
* fix build failure with musl
ver 0.18.19 (2014/11/26) ver 0.18.19 (2014/11/26)
* archive * archive
- zzip: fix crash after seeking - zzip: fix crash after seeking

View File

@@ -1,10 +1,10 @@
AC_PREREQ(2.60) AC_PREREQ(2.60)
AC_INIT(mpd, 0.18.19, mpd-devel@musicpd.org) AC_INIT(mpd, 0.18.22, mpd-devel@musicpd.org)
VERSION_MAJOR=0 VERSION_MAJOR=0
VERSION_MINOR=18 VERSION_MINOR=18
VERSION_REVISION=19 VERSION_REVISION=22
VERSION_EXTRA=0 VERSION_EXTRA=0
AC_CONFIG_SRCDIR([src/Main.cxx]) AC_CONFIG_SRCDIR([src/Main.cxx])

View File

@@ -20,33 +20,45 @@
#ifndef COMPILER_H #ifndef COMPILER_H
#define COMPILER_H #define COMPILER_H
#define GCC_CHECK_VERSION(major, minor) \ #define GCC_MAKE_VERSION(major, minor, patchlevel) ((major) * 10000 + (minor) * 100 + patchlevel)
(defined(__GNUC__) && \
(__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))))
#ifdef __GNUC__ #ifdef __GNUC__
#define GCC_VERSION (__GNUC__ * 10000 \ #define GCC_VERSION GCC_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#else #else
#define GCC_VERSION 0 #define GCC_VERSION 0
#endif #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__ #ifdef __clang__
# define CLANG_VERSION (__clang_major__ * 10000 \ # define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
+ __clang_minor__ * 100 \
+ __clang_patchlevel__)
# if __clang_major__ < 3 # if __clang_major__ < 3
# error Sorry, your clang version is too old. You need at least version 3.1. # error Sorry, your clang version is too old. You need at least version 3.1.
# endif # endif
#elif defined(__GNUC__) #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. # error Sorry, your gcc version is too old. You need at least version 4.6.
# endif # endif
#else #else
# warning Untested compiler. Use at your own risk! # warning Untested compiler. Use at your own risk!
#endif #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) #if GCC_CHECK_VERSION(4,0)
/* GCC 4.x */ /* GCC 4.x */
@@ -141,7 +153,7 @@
#if defined(__cplusplus) #if defined(__cplusplus)
/* support for C++11 "override" was added in gcc 4.7 */ /* 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 override
#define final #define final
#endif #endif

View File

@@ -112,13 +112,15 @@ db_get_root(void)
Directory * Directory *
db_get_directory(const char *name) db_get_directory(const char *name)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(name != nullptr);
#endif
if (db == nullptr) if (db == nullptr)
return nullptr; return nullptr;
Directory *music_root = db_get_root(); Directory *music_root = db_get_root();
if (name == nullptr)
return music_root;
return music_root->LookupDirectory(name); return music_root->LookupDirectory(name);
} }

View File

@@ -26,7 +26,10 @@
bool bool
DecoderPlugin::SupportsSuffix(const char *suffix) const DecoderPlugin::SupportsSuffix(const char *suffix) const
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(suffix != nullptr); assert(suffix != nullptr);
#endif
return suffixes != nullptr && string_array_contains(suffixes, suffix); return suffixes != nullptr && string_array_contains(suffixes, suffix);
@@ -35,7 +38,10 @@ DecoderPlugin::SupportsSuffix(const char *suffix) const
bool bool
DecoderPlugin::SupportsMimeType(const char *mime_type) const 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); assert(mime_type != nullptr);
#endif
return mime_types != nullptr && return mime_types != nullptr &&
string_array_contains(mime_types, mime_type); string_array_contains(mime_types, mime_type);

View File

@@ -40,7 +40,10 @@ extern "C" {
inline Directory * inline Directory *
Directory::Allocate(const char *path) Directory::Allocate(const char *path)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(path != nullptr); assert(path != nullptr);
#endif
const size_t path_size = strlen(path) + 1; const size_t path_size = strlen(path) + 1;
Directory *directory = Directory *directory =

View File

@@ -155,7 +155,10 @@ InputStream::IsAvailable()
size_t size_t
InputStream::Read(void *ptr, size_t _size, Error &error) InputStream::Read(void *ptr, size_t _size, Error &error)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(ptr != nullptr); assert(ptr != nullptr);
#endif
assert(_size > 0); assert(_size > 0);
return plugin.read(this, ptr, _size, error); return plugin.read(this, ptr, _size, error);
@@ -164,7 +167,10 @@ InputStream::Read(void *ptr, size_t _size, Error &error)
size_t size_t
InputStream::LockRead(void *ptr, size_t _size, Error &error) 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); assert(ptr != nullptr);
#endif
assert(_size > 0); assert(_size > 0);
const ScopeLock protect(mutex); const ScopeLock protect(mutex);

View File

@@ -78,7 +78,10 @@ SongFilter::Item::Item(unsigned _tag, const char *_value, bool _fold_case)
bool bool
SongFilter::Item::StringMatch(const char *s) const SongFilter::Item::StringMatch(const char *s) const
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(s != nullptr); assert(s != nullptr);
#endif
if (fold_case) { if (fold_case) {
char *p = g_utf8_casefold(s, -1); char *p = g_utf8_casefold(s, -1);

View File

@@ -57,7 +57,7 @@ public:
virtual void Close() override; virtual void Close() override;
virtual Song *GetSong(const char *uri_utf8, virtual Song *GetSong(const char *uri_utf8,
Error &error) const override; Error &error) const override;
virtual void ReturnSong(Song *song) const; void ReturnSong(Song *song) const override;
virtual bool Visit(const DatabaseSelection &selection, virtual bool Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory, VisitDirectory visit_directory,
@@ -592,7 +592,7 @@ ProxyDatabase::Visit(const DatabaseSelection &selection,
{ {
// TODO: eliminate the const_cast // TODO: eliminate the const_cast
if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error)) if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error))
return nullptr; return false;
if (!visit_directory && !visit_playlist && selection.recursive && if (!visit_directory && !visit_playlist && selection.recursive &&
(ServerSupportsSearchBase(connection) (ServerSupportsSearchBase(connection)
@@ -617,7 +617,7 @@ ProxyDatabase::VisitUniqueTags(const DatabaseSelection &selection,
{ {
// TODO: eliminate the const_cast // TODO: eliminate the const_cast
if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error)) if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error))
return nullptr; return false;
enum mpd_tag_type tag_type2 = Convert(tag_type); enum mpd_tag_type tag_type2 = Convert(tag_type);
if (tag_type2 == MPD_TAG_COUNT) { if (tag_type2 == MPD_TAG_COUNT) {
@@ -657,7 +657,7 @@ ProxyDatabase::GetStats(const DatabaseSelection &selection,
// TODO: eliminate the const_cast // TODO: eliminate the const_cast
if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error)) if (!const_cast<ProxyDatabase *>(this)->EnsureConnected(error))
return nullptr; return false;
struct mpd_stats *stats2 = struct mpd_stats *stats2 =
mpd_run_stats(connection); mpd_run_stats(connection);

View File

@@ -61,7 +61,7 @@ public:
virtual Song *GetSong(const char *uri_utf8, virtual Song *GetSong(const char *uri_utf8,
Error &error) const override; Error &error) const override;
virtual void ReturnSong(Song *song) const; void ReturnSong(Song *song) const override;
virtual bool Visit(const DatabaseSelection &selection, virtual bool Visit(const DatabaseSelection &selection,
VisitDirectory visit_directory, VisitDirectory visit_directory,

View File

@@ -284,10 +284,13 @@ ffmpeg_send_packet(Decoder &decoder, InputStream &is,
AVFrame *frame, AVFrame *frame,
uint8_t **buffer, int *buffer_size) uint8_t **buffer, int *buffer_size)
{ {
if (packet->pts >= 0 && packet->pts != (int64_t)AV_NOPTS_VALUE) if (packet->pts >= 0 && packet->pts != (int64_t)AV_NOPTS_VALUE) {
auto start = start_time_fallback(*stream);
if (packet->pts >= start)
decoder_timestamp(decoder, decoder_timestamp(decoder,
time_from_ffmpeg(packet->pts - start_time_fallback(*stream), time_from_ffmpeg(packet->pts - start,
stream->time_base)); stream->time_base));
}
AVPacket packet2 = *packet; AVPacket packet2 = *packet;
@@ -394,10 +397,15 @@ ffmpeg_probe(Decoder *decoder, InputStream &is)
avpd.filename = is.uri.c_str(); avpd.filename = is.uri.c_str();
#ifdef AVPROBE_SCORE_MIME #ifdef AVPROBE_SCORE_MIME
#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(56, 5, 1)
/* this attribute was added in libav/ffmpeg version 11, but /* this attribute was added in libav/ffmpeg version 11, but
unfortunately it's "uint8_t" instead of "char", and it's unfortunately it's "uint8_t" instead of "char", and it's
not "const" - wtf? */ not "const" - wtf? */
avpd.mime_type = (uint8_t *)const_cast<char *>(is.GetMimeType()); avpd.mime_type = (uint8_t *)const_cast<char *>(is.GetMimeType());
#else
/* API problem fixed in FFmpeg 2.5 */
avpd.mime_type = is.GetMimeType();
#endif
#endif #endif
return av_probe_input_format(&avpd, true); return av_probe_input_format(&avpd, true);

View File

@@ -52,10 +52,11 @@ public:
children.emplace_back(name, filter); children.emplace_back(name, filter);
} }
virtual AudioFormat Open(AudioFormat &af, Error &error) override; /* virtual methods from class Filter */
virtual void Close(); AudioFormat Open(AudioFormat &af, Error &error) override;
virtual const void *FilterPCM(const void *src, size_t src_size, void Close() override;
size_t *dest_size_r, Error &error); const void *FilterPCM(const void *src, size_t src_size,
size_t *dest_size_r, Error &error) override;
private: private:
/** /**

View File

@@ -34,10 +34,11 @@ class NormalizeFilter final : public Filter {
PcmBuffer buffer; PcmBuffer buffer;
public: public:
virtual AudioFormat Open(AudioFormat &af, Error &error) override; /* virtual methods from class Filter */
virtual void Close(); AudioFormat Open(AudioFormat &af, Error &error) override;
virtual const void *FilterPCM(const void *src, size_t src_size, void Close() override;
size_t *dest_size_r, Error &error); const void *FilterPCM(const void *src, size_t src_size,
size_t *dest_size_r, Error &error) override;
}; };
static Filter * static Filter *

View File

@@ -116,10 +116,11 @@ public:
*/ */
void Update(); void Update();
virtual AudioFormat Open(AudioFormat &af, Error &error) override; /* virtual methods from class Filter */
virtual void Close(); AudioFormat Open(AudioFormat &af, Error &error) override;
virtual const void *FilterPCM(const void *src, size_t src_size, void Close() override;
size_t *dest_size_r, Error &error); const void *FilterPCM(const void *src, size_t src_size,
size_t *dest_size_r, Error &error) override;
}; };
void void

View File

@@ -120,10 +120,11 @@ public:
*/ */
bool Configure(const config_param &param, Error &error); bool Configure(const config_param &param, Error &error);
virtual AudioFormat Open(AudioFormat &af, Error &error) override; /* virtual methods from class Filter */
virtual void Close(); AudioFormat Open(AudioFormat &af, Error &error) override;
virtual const void *FilterPCM(const void *src, size_t src_size, void Close() override;
size_t *dest_size_r, Error &error); const void *FilterPCM(const void *src, size_t src_size,
size_t *dest_size_r, Error &error) override;
}; };
bool bool

View File

@@ -57,10 +57,10 @@ public:
volume = _volume; volume = _volume;
} }
virtual AudioFormat Open(AudioFormat &af, Error &error) override; AudioFormat Open(AudioFormat &af, Error &error) override;
virtual void Close(); void Close() override;
virtual const void *FilterPCM(const void *src, size_t src_size, const void *FilterPCM(const void *src, size_t src_size,
size_t *dest_size_r, Error &error); size_t *dest_size_r, Error &error) override;
}; };
static constexpr Domain volume_domain("pcm_volume"); static constexpr Domain volume_domain("pcm_volume");

View File

@@ -79,7 +79,10 @@ GetFSCharset()
std::string std::string
PathToUTF8(const char *path_fs) PathToUTF8(const char *path_fs)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(path_fs != nullptr); assert(path_fs != nullptr);
#endif
if (fs_charset.empty()) if (fs_charset.empty())
return std::string(path_fs); return std::string(path_fs);
@@ -109,7 +112,10 @@ PathToUTF8(const char *path_fs)
char * char *
PathFromUTF8(const char *path_utf8) PathFromUTF8(const char *path_utf8)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(path_utf8 != nullptr); assert(path_utf8 != nullptr);
#endif
if (fs_charset.empty()) if (fs_charset.empty())
return g_strdup(path_utf8); return g_strdup(path_utf8);

View File

@@ -25,7 +25,10 @@
const char * const char *
PathTraits::GetBaseUTF8(const char *p) PathTraits::GetBaseUTF8(const char *p)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(p != nullptr); assert(p != nullptr);
#endif
const char *slash = strrchr(p, SEPARATOR_UTF8); const char *slash = strrchr(p, SEPARATOR_UTF8);
return slash != nullptr return slash != nullptr
@@ -36,7 +39,10 @@ PathTraits::GetBaseUTF8(const char *p)
std::string std::string
PathTraits::GetParentUTF8(const char *p) PathTraits::GetParentUTF8(const char *p)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(p != nullptr); assert(p != nullptr);
#endif
const char *slash = strrchr(p, SEPARATOR_UTF8); const char *slash = strrchr(p, SEPARATOR_UTF8);
return slash != nullptr return slash != nullptr

View File

@@ -114,7 +114,7 @@ ShoutOutput::Configure(const config_param &param, Error &error)
if (!audio_format.IsFullyDefined()) { if (!audio_format.IsFullyDefined()) {
error.Set(config_domain, error.Set(config_domain,
"Need full audio format specification"); "Need full audio format specification");
return nullptr; return false;
} }
const char *host = require_block_string(param, "host"); const char *host = require_block_string(param, "host");

View File

@@ -178,7 +178,7 @@ const struct playlist_plugin embcue_playlist_plugin = {
embcue_playlist_open_uri, embcue_playlist_open_uri,
nullptr, nullptr,
nullptr,
embcue_playlist_suffixes, embcue_playlist_suffixes,
nullptr, nullptr,
nullptr,
}; };

View File

@@ -77,7 +77,10 @@ TagBuilder::Commit()
inline void inline void
TagBuilder::AddItemInternal(TagType type, const char *value, size_t length) 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); assert(value != nullptr);
#endif
assert(length > 0); assert(length > 0);
char *p = FixTagString(value, length); char *p = FixTagString(value, length);
@@ -98,7 +101,10 @@ TagBuilder::AddItemInternal(TagType type, const char *value, size_t length)
void void
TagBuilder::AddItem(TagType type, const char *value, size_t length) 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); assert(value != nullptr);
#endif
if (length == 0 || ignore_tag_items[type]) if (length == 0 || ignore_tag_items[type])
return; return;
@@ -109,7 +115,10 @@ TagBuilder::AddItem(TagType type, const char *value, size_t length)
void void
TagBuilder::AddItem(TagType type, const char *value) TagBuilder::AddItem(TagType type, const char *value)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(value != nullptr); assert(value != nullptr);
#endif
AddItem(type, value, strlen(value)); AddItem(type, value, strlen(value));
} }

View File

@@ -75,7 +75,7 @@ public:
#ifdef WIN32 #ifdef WIN32
return ::GetCurrentThreadId(); return ::GetCurrentThreadId();
#else #else
return ::pthread_self(); return pthread_self();
#endif #endif
} }
@@ -84,7 +84,7 @@ public:
#ifdef WIN32 #ifdef WIN32
return id == other.id; return id == other.id;
#else #else
return ::pthread_equal(id, other.id); return pthread_equal(id, other.id);
#endif #endif
} }

View File

@@ -43,8 +43,11 @@ gcc_pure gcc_nonnull_all
static inline bool static inline bool
StringEqualsCaseASCII(const char *a, const char *b) StringEqualsCaseASCII(const char *a, const char *b)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(a != nullptr); assert(a != nullptr);
assert(b != nullptr); assert(b != nullptr);
#endif
/* note: strcasecmp() depends on the locale, but for ASCII-only /* note: strcasecmp() depends on the locale, but for ASCII-only
strings, it's safe to use */ strings, it's safe to use */
@@ -55,8 +58,11 @@ gcc_pure gcc_nonnull_all
static inline bool static inline bool
StringEqualsCaseASCII(const char *a, const char *b, size_t n) StringEqualsCaseASCII(const char *a, const char *b, size_t n)
{ {
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(a != nullptr); assert(a != nullptr);
assert(b != nullptr); assert(b != nullptr);
#endif
/* note: strcasecmp() depends on the locale, but for ASCII-only /* note: strcasecmp() depends on the locale, but for ASCII-only
strings, it's safe to use */ strings, it's safe to use */

View File

@@ -35,7 +35,7 @@
#include <new> #include <new>
#include <utility> #include <utility>
#if !defined(__clang__) && __GNUC__ && !GCC_CHECK_VERSION(4,8) #if GCC_OLDER_THAN(4,8)
#include <type_traits> #include <type_traits>
#endif #endif
@@ -54,7 +54,7 @@
*/ */
template<class T> template<class T>
class Manual { 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 */ /* no alignas() on gcc < 4.8: apply worst-case fallback */
__attribute__((aligned(8))) __attribute__((aligned(8)))
#else #else

View File

@@ -128,8 +128,11 @@ uri_remove_auth(const char *uri)
bool bool
uri_is_child(const char *parent, const char *child) 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(parent != nullptr);
assert(child != nullptr); assert(child != nullptr);
#endif
const size_t parent_length = strlen(parent); const size_t parent_length = strlen(parent);
return memcmp(parent, child, parent_length) == 0 && return memcmp(parent, child, parent_length) == 0 &&