Seeking help with some Clang trouble, compiling ceph
Dimitry Andric
dim at FreeBSD.org
Fri Oct 21 15:21:44 UTC 2016
On 21 Oct 2016, at 17:07, Willem Jan Withagen <wjw at digiware.nl> wrote:
>
> On 21-10-2016 15:09, Willem Jan Withagen wrote:
>> Hi,
>>
>> All this Ceph stuff finally used to compile under FreeBSD.
>> And all testss completed correctly.
>>
>> But somewhere in the Ceph-tree there was a lot of template and trait
>> code added/replaced.
>> Problem is that this compiles under GCC, but Clang throws an error. It
>> looks like it cannot select types of automagic conversion.
>>
>> But this template/trait stuff is too much for me to wrap my head around.
>> I'm reading up a lot, but that does not yet get me anywhere.
>>
>> So I was wondering if anybody with more C++ knowledge would like to
>> assist and give some clues as to how to fix this.
>>
>> The error report is at:
>>
>> http://cephdev.digiware.nl:8180/jenkins/job/ceph-freebsd/39/consoleFull
>>
>> And the ceph code can be found at:
>> https://github.com/ceph/ceph
>
> Oke, the preson responsable for the change helped to figure it out, and
> it looks like the following diff helps
>
> diff --git a/src/include/denc.h b/src/include/denc.h
> index 59f7686..caa095b 100644
> --- a/src/include/denc.h
> +++ b/src/include/denc.h
> @@ -722,7 +722,7 @@ struct denc_traits<
> template<typename T>
> struct denc_traits<
> std::vector<T>,
> - typename std::enable_if<denc_traits<T>::supported>::type> {
> + typename std::enable_if<denc_traits<T>::supported != 0>::type> {
> typedef denc_traits<T> traits;
>
> enum { supported = true };
> @@ -831,7 +831,7 @@ struct denc_traits<
> template<typename T>
> struct denc_traits<
> std::set<T>,
> - typename std::enable_if<denc_traits<T>::supported>::type> {
> + typename std::enable_if<denc_traits<T>::supported != 0>::type> {
> typedef denc_traits<T> traits;
>
> enum { supported = true };
>
> And the conclusion is that std::enable_if<> does not always like it when
> the value is 'int'.
> the definition of supported is:
> struct denc_traits {
> enum { supported = 0 };
> enum { featured = false };
> enum { bounded = false };
> };
>
> and values can range 0..2.
>
> So is this a GCC liberalization, or is Clang here to picky?
It's hard to say without the full source code and a reproducer, but I'd
say that enable_if has a bool as the first template argument, so it
can't match an int by default. Maybe libstdc++ has a variant with an
int as the first template argument, but I haven't looked.
-Dimitry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 194 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freebsd.org/pipermail/freebsd-toolchain/attachments/20161021/7cde2414/attachment.sig>
More information about the freebsd-toolchain
mailing list