lib: work around talloc_steal usage from C++ code

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>
This commit is contained in:
Jani Nikula 2012-04-12 23:57:39 +03:00 committed by David Bremner
parent cddc270346
commit de0557477d

View file

@ -495,8 +495,26 @@ notmuch_filenames_t *
_notmuch_filenames_create (const void *ctx, _notmuch_filenames_create (const void *ctx,
notmuch_string_list_t *list); notmuch_string_list_t *list);
#pragma GCC visibility pop
NOTMUCH_END_DECLS 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 #endif