Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 21 Oct 2016 18:08:17 +0200
From:      Willem Jan Withagen <wjw@digiware.nl>
To:        Dimitry Andric <dim@FreeBSD.org>
Cc:        FreeBSD Toolchain <freebsd-toolchain@freebsd.org>
Subject:   Re: Seeking help with some Clang trouble, compiling ceph
Message-ID:  <a8e0700b-fec2-75cc-3504-e02b357d45ef@digiware.nl>
In-Reply-To: <8DCCD19E-01EE-4DB4-814E-396D3E450275@FreeBSD.org>
References:  <c88fd975-b379-ac79-0979-03407565781a@digiware.nl> <7b6713f1-5671-bdc2-9cb5-97171146bc59@digiware.nl> <8DCCD19E-01EE-4DB4-814E-396D3E450275@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 21-10-2016 17:21, Dimitry Andric wrote:
> On 21 Oct 2016, at 17:07, Willem Jan Withagen <wjw@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.

Which I understand.... Ceph source is a rather big monster.
OTOH it is mostly fetching with git, install-deps.sh and compiling,
but it does require quite some packages to be installed.

If you would be willing, I'd be able to give you a receipe or shell
script to just do that. Or I could give you a shell account on the
jenkins box and you go from what is there...

So what you are suggesting is looking into the include tree of gcc and
check what flavours of enable_if are there? And if it would take 'int'

--WjW






Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?a8e0700b-fec2-75cc-3504-e02b357d45ef>