[cfe-dev] Compile error with libc++'s bind

Howard Hinnant hhinnant at apple.com
Fri May 20 12:18:10 PDT 2011


On May 20, 2011, at 2:59 PM, Jonathan Sauer wrote:

> Hello,
> 
> the following program fails to compile with clang trunk and libc++ trunk (note the implicit conversion from <const char*>
> to <std::string> when calling the functor in <doIt>):
> 
> #include <functional>
> 
> using namespace std::placeholders;
> 
> template <typename Functor>
> static void doIt(Functor f)
> {
>  f("");
> }
> 
> static void method(const std::string&);	// A
> //static void method(const char*);	// B
> 
> int main(int, char**)
> {
>  doIt(std::bind(&method, _1));
> }
> 
> 
> This results in the following error:
> 
> $ ~/LLVM/build/Release+Asserts/bin/clang -std=c++0x -stdlib=libc++ clang.cpp
> In file included from clang.cpp:1:
> /usr/include/c++/v1/functional:1620:8: error: no type named 'type' in 'std::__1::__invoke_of<void
>      (*&)(const std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>
>> &), char const (&)[1]>'
>> ::type type;
> 
> 
> Commenting line (A) and uncommenting line (B), i.e. removing the implicit conversion, makes the code compile.
> 
> I looked into the standard, section 20.8, but was unable to find anything about implicit conversions, although it seems to
> me from reading 20.8.2p1 that they should be allowed.
> 
> A similar code used to compile with an older version of libc++ (most likely before Howard's implementations in r131639ff.
> 
> So my question is: Is this a bug in libc++, or are implicit conversions not allowed, and the similar code used to compile
> because of an implementation artefact that was removed during r131639ff?

This looks like a bug either in the new __invoke_of trait, or in clang's SFINAE / overload handling. Not sure yet.  Investigating...

Howard




More information about the cfe-dev mailing list