<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Menlo;}
@font-face
        {font-family:"Source Code Pro";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">I got a little bit confused trying to get a repro of __builtin_strlen in libc++ with gcc.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">At least the behavior of __builtin_strlen is different in clang and gcc.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">This passed<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">g++ -o /dev/null -std=c++17 --compile test2.cc<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">while this failed<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">clang++ -o /dev/null -std=c++17 --compile test2.cc<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">with error messages:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">test2.cc:6:19: error: static_assert expression is not an integral constant expression<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">    static_assert(!test(s));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                  ^~~~~~~~<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">test2.cc:3:12: note: read of non-constexpr variable 's' is not allowed in a constant expression<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">    return __builtin_strlen(s);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">           ^<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">test2.cc:6:20: note: in call to 'test(&s[0])'<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">    static_assert(!test(s));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">                   ^<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">1 error generated.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">For one same file:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">const char s[] = "";<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">constexpr int test(const char* s) {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">    return __builtin_strlen(s);<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">constexpr void __main() {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">    static_assert(!test(s));<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><a name="_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif">Hmmm...  I think __builtin_strlen is constexpr on gcc.<o:p></o:p></span></a></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p> </o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif">Looking at a more minimal case:<o:p></o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p> </o:p></span></span></p>
</div>
<div>
<p style="margin:0in;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginal"><b><span lang="DE-CH" style="font-size:9.0pt;font-family:"Menlo",serif;color:#9B2393">int</span></b></span><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:9.0pt;font-family:"Menlo",serif;color:black">
 main() { </span></span><span style="mso-bookmark:_MailOriginal"><b><span lang="DE-CH" style="font-size:9.0pt;font-family:"Menlo",serif;color:#9B2393">static_assert</span></b></span><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:9.0pt;font-family:"Menlo",serif;color:black">(!__builtin_strlen(</span></span><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:9.0pt;font-family:"Menlo",serif;color:#C41A16">""</span></span><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:9.0pt;font-family:"Menlo",serif;color:black">));
 }<o:p></o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p> </o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif">It compiles fine under:<o:p></o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p> </o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif">gcc 9.2, libstdc++<o:p></o:p></span></span></p>
</div>
<div>
<p style="margin:0in;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:8.5pt;font-family:"Source Code Pro",serif;color:black">/usr/local/gcc/bin/g++-9 -std=c++17 a.cpp<o:p></o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p> </o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif">clang 8, libc++<o:p></o:p></span></span></p>
</div>
<div>
<p style="margin:0in;margin-bottom:.0001pt"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:8.5pt;font-family:"Source Code Pro",serif;color:black">/usr/local/clang/bin/clang++ -std=c++17 a.cpp<o:p></o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p> </o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif">gcc 9.2, libc++<o:p></o:p></span></span></p>
</div>
<div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:8.5pt;font-family:"Source Code Pro",serif;color:black">/usr/local/gcc/bin/g++-9 -nostdinc++ -I /usr/local/clang/include/c++/v1 -nodefaultlibs -lc++ -lc++abi -lm
 -lc -lgcc -std=c++17 a.cpp</span></span><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"><o:p></o:p></span></span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal"><span style="mso-bookmark:_MailOriginal"><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif"> </span></span><span lang="DE-CH" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:#1F497D"><o:p></o:p></span></p>
</div>
</body>
</html>