Implicit typecast from 'void *' to 'T *' is okay in C, but not in C++. In talloc_steal, an explicit cast is provided for type safety in some GCC versions. Otherwise, a cast is required. Provide a template function for this to maintain type safety, and redefine talloc_steal to use it. The template must be outside the extern "C" block (NOTMUCH_BEGIN_DECLS and NOTMUCH_END_DECLS), but keep it within the GCC visibility #pragma. No functional changes, apart from making the library build with compilers other than recent GCC. Signed-off-by: Jani Nikula <jani@nikula.org> --- For background, see discussion starting at id:"1333966665-10469-5-git-send-email-Vladimir.Marek@oracle.com" Vladimir, please test this. Thanks. --- lib/notmuch-private.h | 22 ++++++++++++++++++++-- 1 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index ea836f7..3886e0c 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -495,8 +495,26 @@ notmuch_filenames_t * _notmuch_filenames_create (const void *ctx, notmuch_string_list_t *list); -#pragma GCC visibility pop - NOTMUCH_END_DECLS +#ifdef __cplusplus +/* Implicit typecast from 'void *' to 'T *' is okay in C, but not in + * C++. In talloc_steal, an explicit cast is provided for type safety + * in some GCC versions. Otherwise, a cast is required. Provide a + * template function for this to maintain type safety, and redefine + * talloc_steal to use it. + */ +#if !(__GNUC__ >= 3) +template <class T> T * +_notmuch_talloc_steal (const void *new_ctx, const T *ptr) +{ + return static_cast<T *> (talloc_steal (new_ctx, ptr)); +} +#undef talloc_steal +#define talloc_steal _notmuch_talloc_steal +#endif +#endif + +#pragma GCC visibility pop + #endif -- 1.7.5.4