[cfe-dev] Fixes to partial ordering break Boost.Hana

Pavel A. Lebedev via cfe-dev cfe-dev at lists.llvm.org
Mon Jan 16 11:17:15 PST 2017


Hi,

Any comments on this?
As it stands, clang 4 will be unusable with Boost.Hana,
at least the already released versions.
In case this is actually the library's fault, this is being discussed at
https://github.com/boostorg/hana/issues/318

> -----Original Message-----
> From: cfe-dev [mailto:cfe-dev-bounces at lists.llvm.org] On Behalf Of Pavel A. Lebedev via cfe-dev
> Sent: Tuesday, January 10, 2017 2:21 AM
> To: 'Clang Dev' <cfe-dev at lists.llvm.org>
> Subject: [cfe-dev] Fixes to partial ordering break Boost.Hana
> 
> Hi.
> 
> Commit r290511 "Fix some subtle wrong partial ordering bugs particularly
> with C++1z auto-typed non-type template parameters"
> seems to break some template specialization tricks at the core of
> Boost.Hana
> library.
> The reduced example is:
> 
> $ cat hana.cpp
> 
> // SFINAE helpers.
> 
> template<bool Condition>
> struct when;
> 
> template<typename...>
> struct is_valid
> {
>     static constexpr bool value = true;
> };
> 
> // A class and its tag.
> 
> struct c_tag;
> 
> struct C
> {
>     using tag = c_tag;
> };
> 
> // Tag getter. When a type has a nested type "tag", it specifies its tag.
> // When it doesn't have one, the tag is type itself.
> 
> template<typename T,typename = void>
> struct tag_of : tag_of<T,when<true>> {};
> 
> template<typename T,bool Condition>
> struct tag_of<T,when<Condition>>
> {
>     using type = T;
> };
> 
> template<typename T>
> struct tag_of<T,when<is_valid<typename T::tag>::value>>
> {
>     using type = typename T::tag;
> };
> 
> // Attempt to calculate tag of C.
> 
> using tag_of_c = typename tag_of<C>::type;
> 
> 
> $ clang++ -std=c++14 -fsyntax-only hana.cpp
> 
> hana.cpp:25:17: error: ambiguous partial specializations of 'tag_of<C,
> when<true> >'
> struct tag_of : tag_of<T,when<true>> {};
>                 ^
> hana.cpp:41:27: note: in instantiation of template class 'tag_of<C,
> void>'
> requested here
> using tag_of_c = typename tag_of<C>::type;
>                           ^
> hana.cpp:28:8: note: partial specialization matches [with T = C,
> Condition =
> true]
> struct tag_of<T,when<Condition>>
>        ^
> hana.cpp:34:8: note: partial specialization matches [with T = C]
> struct tag_of<T,when<is_valid<typename T::tag>::value>>
>        ^
> 1 error generated.
> 
> 
> Is this a problem with the library or clang?
 
---
Pavel A. Lebedev




More information about the cfe-dev mailing list