[LLVMbugs] [Bug 22135] New: std::common_type<void, void> fails to compile

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu Jan 8 13:48:57 PST 2015


http://llvm.org/bugs/show_bug.cgi?id=22135

            Bug ID: 22135
           Summary: std::common_type<void, void> fails to compile
           Product: libc++
           Version: 3.4
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: unassignedclangbugs at nondot.org
          Reporter: pip88nl at gmail.com
                CC: llvmbugs at cs.uiuc.edu, mclow.lists at gmail.com
    Classification: Unclassified

>From the description of std::common_type in the draft N4296, paragraph
20.10.7.6:

The member typedef type shall be defined as set out below. All types in the
parameter pack T shall be complete or (possibly cv) void.

Further down, it specifies the implementation of common_type as follows:

— If sizeof...(T) is greater than one, let T1, T2, and R, respectively, denote
the first, second, and (pack of) remaining types comprising T. [ Note:
sizeof...(R) may be zero. — end note ] Let C denote the type, if any, of an
unevaluated conditional expression (5.16) whose first operand is an arbitrary
value of type bool, whose second operand is an xvalue of type T1, and whose
third operand is an xvalue of type T2. If there is such a type C, the member
typedef type shall denote the same type, if any, as common_type_t<C,R...>.

The problem here is that expression of type void are never xvalues, since there
is no way to create (rvalue) references to void. This is a defect in the
standard draft not present in the C++11 standard (where the implementation is
defined in terms of declval<T>()).

I suggest specialising the libc++ implementation such that argument packs
containing only void cause the type defined within common_type to be void.

My workaround is this:

template<typename ...Types>
struct common_type;

template<typename Type1, typename Type2, typename ...Types>
struct common_type<Type1, Type2, Types...>
  : common_type<typename common_type<Type1, Type2>::type, Types...>
{ };

template<typename Type1, typename Type2>
struct common_type<Type1, Type2>
  : std::common_type<Type1, Type2>
{ };

template<>
struct common_type<void, void>
{ typedef void type; };

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20150108/3306cbfa/attachment.html>


More information about the llvm-bugs mailing list