<div dir="auto">This looks like a bug in Clang to me. I'll investigate tomorrow.</div><div class="gmail_extra"><br><div class="gmail_quote">On 16 Jan 2017 11:17 am, "Pavel A. Lebedev via cfe-dev" <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
Any comments on this?<br>
As it stands, clang 4 will be unusable with Boost.Hana,<br>
at least the already released versions.<br>
In case this is actually the library's fault, this is being discussed at<br>
<a href="https://github.com/boostorg/hana/issues/318" rel="noreferrer" target="_blank">https://github.com/boostorg/<wbr>hana/issues/318</a><br>
<br>
> -----Original Message-----<br>
> From: cfe-dev [mailto:<a href="mailto:cfe-dev-bounces@lists.llvm.org">cfe-dev-bounces@lists.<wbr>llvm.org</a>] On Behalf Of Pavel A. Lebedev via cfe-dev<br>
> Sent: Tuesday, January 10, 2017 2:21 AM<br>
> To: 'Clang Dev' <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>><br>
> Subject: [cfe-dev] Fixes to partial ordering break Boost.Hana<br>
><br>
> Hi.<br>
><br>
> Commit r290511 "Fix some subtle wrong partial ordering bugs particularly<br>
> with C++1z auto-typed non-type template parameters"<br>
> seems to break some template specialization tricks at the core of<br>
> Boost.Hana<br>
> library.<br>
> The reduced example is:<br>
><br>
> $ cat hana.cpp<br>
><br>
> // SFINAE helpers.<br>
><br>
> template<bool Condition><br>
> struct when;<br>
><br>
> template<typename...><br>
> struct is_valid<br>
> {<br>
>     static constexpr bool value = true;<br>
> };<br>
><br>
> // A class and its tag.<br>
><br>
> struct c_tag;<br>
><br>
> struct C<br>
> {<br>
>     using tag = c_tag;<br>
> };<br>
><br>
> // Tag getter. When a type has a nested type "tag", it specifies its tag.<br>
> // When it doesn't have one, the tag is type itself.<br>
><br>
> template<typename T,typename = void><br>
> struct tag_of : tag_of<T,when<true>> {};<br>
><br>
> template<typename T,bool Condition><br>
> struct tag_of<T,when<Condition>><br>
> {<br>
>     using type = T;<br>
> };<br>
><br>
> template<typename T><br>
> struct tag_of<T,when<is_valid<<wbr>typename T::tag>::value>><br>
> {<br>
>     using type = typename T::tag;<br>
> };<br>
><br>
> // Attempt to calculate tag of C.<br>
><br>
> using tag_of_c = typename tag_of<C>::type;<br>
><br>
><br>
> $ clang++ -std=c++14 -fsyntax-only hana.cpp<br>
><br>
> hana.cpp:25:17: error: ambiguous partial specializations of 'tag_of<C,<br>
> when<true> >'<br>
> struct tag_of : tag_of<T,when<true>> {};<br>
>                 ^<br>
> hana.cpp:41:27: note: in instantiation of template class 'tag_of<C,<br>
> void>'<br>
> requested here<br>
> using tag_of_c = typename tag_of<C>::type;<br>
>                           ^<br>
> hana.cpp:28:8: note: partial specialization matches [with T = C,<br>
> Condition =<br>
> true]<br>
> struct tag_of<T,when<Condition>><br>
>        ^<br>
> hana.cpp:34:8: note: partial specialization matches [with T = C]<br>
> struct tag_of<T,when<is_valid<<wbr>typename T::tag>::value>><br>
>        ^<br>
> 1 error generated.<br>
><br>
><br>
> Is this a problem with the library or clang?<br>
<br>
---<br>
Pavel A. Lebedev<br>
<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>