On 21 Oct 2016, at 17:07, Willem Jan Withagen <w...@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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to