<div dir="ltr">I think this is a problem with your expectations<div><br></div><div>The code in your main function is evalualated equivalent like this.</div><div><br></div><div><span style="font-size:12.8px"> ((std::cout << "return: ") << bar()) << std::endl;</span><br></div><div><br></div><div>The << operators are evaluated left to right one at a time. Just as they would be in the case of something like  "foo() + bar() + baz()"</div><div><br></div><div>The << operator for cout prints and then return a reference to its left hand side so that multiple << can be chained together. Due to that, another way to write this is:</div><div><br></div><div>std::cout << "return: ";</div><div>std::cout << bar();</div><div>std::cout << std::endl;</div><div><br></div><div><span style="font-size:12.8px"><br></span></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Sat, Dec 23, 2017 at 7:47 PM, Leslie Zhai via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi LLVM developers,<br>
<br>
A C++ testcase for PR35737<br>
<br>
#include <iostream><br>
<br>
int bar() {<br>
  std::cout << "bar" << std::endl;<br>
  return 1;<br>
}<br>
<br>
int main() {<br>
  std::cout << "return: " << bar() << std::endl;<br>
  return 0;<br>
}<br>
<br>
Actual output:<br>
<br>
return: bar<br>
1<br>
<br>
Expected output:<br>
<br>
bar<br>
return: 1<br>
<br>
Workaround to edit LLVM IR:<br>
<br>
--- PR35737.ll  2017-12-24 11:20:<a href="tel:12.012346163" value="+12012346163" target="_blank">12.012346163</a> +0800<br>
+++ PR35737-workaround.ll       2017-12-24 11:42:25.303256968 +0800<br>
@@ -62,8 +62,8 @@<br>
 entry:<br>
   %retval = alloca i32, align 4<br>
   store i32 0, i32* %retval, align 4<br>
-  %call = call dereferenceable(272) %"class.std::basic_ostream"* @_ZStlsISt11char_traitsIcEERSt<wbr>13basic_ostreamIcT_ES5_PKc(%"<wbr>class.std::basic_ostream"* dereferenceable(272) @_ZSt4cout, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0))<br>
   %call1 = call i32 @_Z3barv()<br>
+  %call = call dereferenceable(272) %"class.std::basic_ostream"* @_ZStlsISt11char_traitsIcEERSt<wbr>13basic_ostreamIcT_ES5_PKc(%"<wbr>class.std::basic_ostream"* dereferenceable(272) @_ZSt4cout, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0))<br>
   %call2 = call dereferenceable(272) %"class.std::basic_ostream"* @_ZNSolsEi(%"class.std::basic_<wbr>ostream"* %call, i32 %call1)<br>
   %call3 = call dereferenceable(272) %"class.std::basic_ostream"* @_ZNSolsEPFRSoS_E(%"class.std:<wbr>:basic_ostream"* %call2, %"class.std::basic_ostream"* (%"class.std::basic_ostream"*)<wbr>* @_ZSt4endlIcSt11char_traitsIcE<wbr>ERSt13basic_ostreamIT_T0_ES6_)<br>
   ret i32 0<br>
<br>
<br>
Then,<br>
<br>
$ llc PR35737-workaround.ll<br>
<br>
$ clang++ PR35737-workaround.s<br>
<br>
$ ./a.out<br>
<br>
bar<br>
return: 1<br>
<br>
Please give me some advice, thanks a lot!<span class="HOEnZb"><font color="#888888"><br>
<br>
-- <br>
Regards,<br>
Leslie Zhai - <a href="https://reviews.llvm.org/p/xiangzhai/" rel="noreferrer" target="_blank">https://reviews.llvm.org/p/xia<wbr>ngzhai/</a><br>
<br>
<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</font></span></blockquote></div><br></div>