<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Mon, Jun 17, 2013 at 7:28 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">On Mon, Jun 17, 2013 at 1:50 AM, Alexey Samsonov <span dir="ltr"><<a href="mailto:samsonov@google.com" target="_blank">samsonov@google.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hi cfe-dev!</div><div><br></div>Consider the following code:<div><div>$ cat str.cc</div>

<div>extern const char* const AAA;</div><div>extern const char* const BBB;</div><div>const char* const AAA = "aaa";<br>
</div><div>const char* const BBB = AAA;</div><div><br></div><div>"g++ -O0" and "clang++ -O0" behave differently: gcc emits both AAA and BBB as</div><div>linker-initialized constants, while Clang initializes BBB during static initialization:</div>


<div>$ g++ -O0 -c str.cc -o a.o ; objdump -d a.o<br></div><div><div>a.o:     file format elf64-x86-64</div><div><div>$ ./bin/clang++ -O0 -c str.cc -o a.o ; objdump -d a.o</div><div>a.o:     file format elf64-x86-64<br>
</div><div>Disassembly of section .text.startup:<br></div><div>0000000000000000 <__cxx_global_var_init>:<br></div><div>   0:<span style="white-space:pre-wrap">   </span>55                   <span style="white-space:pre-wrap">   </span>push   %rbp</div>


<div>   1:<span style="white-space:pre-wrap">     </span>48 89 e5             <span style="white-space:pre-wrap">   </span>mov    %rsp,%rbp</div><div>   4:<span style="white-space:pre-wrap">    </span>48 8b 04 25 00 00 00 <span style="white-space:pre-wrap">   </span>mov    0x0,%rax</div>


<div>   b:<span style="white-space:pre-wrap">     </span>00 </div><div>   c:<span style="white-space:pre-wrap"> </span>48 89 04 25 00 00 00 <span style="white-space:pre-wrap">   </span>mov    %rax,0x0</div><div>  13:<span style="white-space:pre-wrap">     </span>00 </div>


<div>  14:<span style="white-space:pre-wrap">     </span>5d                   <span style="white-space:pre-wrap">   </span>pop    %rbp</div><div>  15:<span style="white-space:pre-wrap"> </span>c3                   <span style="white-space:pre-wrap">   </span>retq   </div>


<div>  16:<span style="white-space:pre-wrap">     </span>66 2e 0f 1f 84 00 00 <span style="white-space:pre-wrap">   </span>nopw   %cs:0x0(%rax,%rax,1)</div><div>  1d:<span style="white-space:pre-wrap"> </span>00 00 00 </div>
<div>0000000000000020 <_GLOBAL__I_a>:<br></div><div>  20:<span style="white-space:pre-wrap">      </span>55                   <span style="white-space:pre-wrap">   </span>push   %rbp</div><div>  21:<span style="white-space:pre-wrap"> </span>48 89 e5             <span style="white-space:pre-wrap">   </span>mov    %rsp,%rbp</div>


<div>  24:<span style="white-space:pre-wrap">     </span>e8 d7 ff ff ff       <span style="white-space:pre-wrap">   </span>callq  0 <__cxx_global_var_init></div><div>  29:<span style="white-space:pre-wrap">      </span>5d                   <span style="white-space:pre-wrap">   </span>pop    %rbp</div>


<div>  2a:<span style="white-space:pre-wrap">     </span>c3                   <span style="white-space:pre-wrap">   </span>retq</div></div><div><br></div><div><br></div><div>Is Clang correct here? I imagine that user who wrote the code might expect the</div>


<div>"constant strings" to go in .rodata and be safely accessible during static initialization.</div><span><font color="#888888"><div></div></font></span></div></div></div><br></blockquote><div><br></div>
</div></div><div>clang is correct in the sense that the C++ standard doesn't require the compiler to use static initialization for BBB.  [basic.start.init] is the relevant section in the standard; "AAA" doesn't count as a constant expression.  You can "fix" this using constexpr.</div>
</div></div></div></blockquote><div><br></div><div>I see.  Another question is whether Clang should always do constant initialization, although it's not required.</div></div><br clear="all"><div><br></div>-- <br><div>
Alexey Samsonov, MSK</div>
</div></div>