<div dir="ltr">This sounds like <a href="http://llvm.org/bugs/show_bug.cgi?id=12961">http://llvm.org/bugs/show_bug.cgi?id=12961</a> to me. But it's not clear if this is expected or not.</div><div class="gmail_extra"><br>

<br><div class="gmail_quote">On Thu, May 22, 2014 at 6:12 PM,  <span dir="ltr"><<a href="mailto:antoni@buszta.info" target="_blank">antoni@buszta.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Hi all,<br>
<br>
I have some small problem with clang behavior in such code:<br>
<br>
struct stream<br>
{<br>
    stream() {}<br>
    template<typename T><br>
    inline stream& operator<<(T& t)<br>
    {<br>
        return *this;<br>
    }<br>
};<br>
<br>
template<typename Stream><br>
inline Stream& operator<<(Stream& stream, int& t)<br>
{<br>
    return stream;<br>
}<br>
<br>
int main(int argc, char *argv[])<br>
{<br>
    int i = 42;<br>
    stream a;<br>
    a << i;<br>
<br>
    return 0;<br>
}<br>
<br>
This code compiles fine under clang (I have checked with 3.4 and current trunk) and gcc. However when I add -std=c++11 it still compiles fine under gcc but it stops compiling under clang. Error is:<br>
<br>
/home/abuszta/Development/<u></u>llvm/bin/clang++ -std=c++11    operator.cpp   -o operator<br>
operator.cpp:21:7: error: use of overloaded operator '<<' is ambiguous (with operand types 'stream' and 'int')<br>
    a << i;<br>
    ~ ^  ~<br>
operator.cpp:5:20: note: candidate function [with T = int]<br>
    inline stream& operator<<(T& t)<br>
                   ^<br>
operator.cpp:12:16: note: candidate function [with Stream = stream]<br>
inline Stream& operator<<(Stream& stream, int& t)<br>
               ^<br>
1 error generated.<br>
<br>
In order to answer the question which behavior is good and which is bad I tried to find appropriate section in C++ standard. After analyzing 14.5.6.2 (section about Partial ordering of function templates in N3337) and related I think there should not be any ambiguity after substitution and function should be choosed...<br>


<br>
What is more, when I make const stream a; this code compiles fine even with -std=c++11 and chooses the standalone function in favor to member function which suggests that there may be some problem with template resolution here.<br>


<br>
What is your interpretation of this behavior? Should I report bug?<br>
<br>
Best regards,<br>
Antoni Buszta.<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div>