<div dir="ltr"><div><a style="font-size:10pt">A request to change Clang's __PRETTY_FUNCTION__ output to fix an issue.</a></div><div><a style="font-size:10pt"><br></a></div><a style="font-size:10pt"></a><div><a style="font-size:10pt"></a><a style="font-size:10pt"></a><a style="font-size:small"></a><div style="font-size:small"><a>The code used in pretty function is also used to generate debug info in </a><a><div style="display:inline">DWARF etc</div></a><a><div style="display:inline">.</div></a></div><div style="font-size:small"><a><div style="display:inline">(I believe). See, for instance the comment on this bug report:</div></a></div><div style="font-size:small"><a><div style="display:inline">https://sourceware.org/bugzilla/show_bug.cgi?id=21492#c1</div></a></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote"><span style="color:rgb(0,0,0);white-space:pre-wrap">Clang shows these arguments with the same DW_AT_name, X<1>, but they're distinct types</span></blockquote></div><div style="font-size:small"><span style="color:rgb(0,0,0);font-size:medium;white-space:pre-wrap"><br></span></div><div style="font-size:small"><span style="font-size:13.3333px"><a href="https://godbolt.org/z/0Ik0Hl">https://godbolt.org/z/0Ik0Hl</a></span><span style="color:rgb(0,0,0);font-size:medium;white-space:pre-wrap"><br></span></div>Pretty function output, for auto... args<div>(variadic just so that outputs display together):<div><span style="font-size:13.3333px"><br></span><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><a style="font-size:10pt"><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div><div><div><span style="color:rgb(0,0,255)">template</span> <<span style="color:rgb(0,0,255)">auto</span>... V></div><div><span style="color:rgb(0,0,255)">constexpr</span> <span style="color:rgb(0,0,255)">char</span> <span style="color:rgb(0,0,255)">const</span>* auto_name()</div><div>{</div><div>       <span style="color:rgb(0,0,255)">return</span> __PRETTY_FUNCTION__;</div><div>}</div><br><div><span style="color:rgb(0,0,255)">enum</span> e { a, b, c=b };</div><div><span style="color:rgb(0,0,255)">enum</span> <span style="color:rgb(0,0,255)">class</span> E { a, b, c=b };</div><br><div><span style="color:rgb(0,0,255)">char</span> <span style="color:rgb(0,0,255)">const</span>* nameU() { <span style="color:rgb(0,0,255)">return</span> auto_name<a, b, c, e(<span style="color:rgb(9,136,90)">3</span>)>(); }</div><div><span style="color:rgb(0,0,255)">char</span> <span style="color:rgb(0,0,255)">const</span>* nameS() { <span style="color:rgb(0,0,255)">return</span> auto_name<E::a, E::b, E::c, E{<span style="color:rgb(9,136,90)">3</span>}>(); }</div></div></div></div></a></div></blockquote></div><div><a></a><div><a></a><div style="font-size:small"><a></a><a style="font-size:10pt"><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div><br></div></div></a></div><div style="font-size:small"><a style="font-size:10pt">Gives output with these strings embedded;</a></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><a></a><div><a></a><div style="font-size:small"><a></a><a style="font-size:10pt">nameU: </a><a style="font-size:10pt"><div style="color:rgb(0,0,0);background-color:rgb(255,255,254);display:inline"><div style="display:inline"><span style="color:rgb(163,21,21)"><a, b, b, 3></span></div></div></a></div></div></div></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><a></a><div><a>nameS: </a><a><div style="display:inline"><div style="color:rgb(0,0,0);background-color:rgb(255,255,254);display:inline"><div style="display:inline"><span style="color:rgb(163,21,21)"><E::a, E::b, E::b, 3></span></div></div></div></a></div></div></blockquote></blockquote></blockquote></blockquote></blockquote></blockquote><div><a><div><div style="font-size:small"><br></div><div style="font-size:small">The first two enumerated values, a & b, are returned with no loss of type info as a, b.</div></div><div style="font-size:small">The next enumerated value, c, is a duplicate label for b's value, and is reported as b.</div><div style="font-size:small">The final value is not enumerated - there is no enum label with value 3 -</div></a><div style="font-size:small"><a>it is reported with </a><a>an unnecessary loss of type info </a><a><div style="display:inline!important">as plain digits 3.</div></a></div><div style="font-size:small"><br></div><div style="font-size:small">The non-enumerated value should be reported with a cast or constructor:</div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div><a><div style="font-size:small">unscoped e: 3 -> (e)3 or e(3)</div></a></div></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><a><div style="display:inline!important">  scoped   E: 3 -> (E)3 or E(3) or E{3}</div></a></blockquote></blockquote></blockquote></blockquote></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div style="font-size:small"><a> (init-list E{3} only for scoped enum and only since c++17)</a><a><div style="display:inline">    </div></a></div></blockquote></blockquote></blockquote><div><a></a><div style="font-size:small"><a></a><a><div style="display:inline">Question 1:</div></a><br></div><div style="font-size:small">Will it be acceptable to change the output for non-enumerated values as so?</div><div style="font-size:small"><a><div style="display:inline">This will retain type info and allow round-trip without loss.</div></a></div><div style="font-size:small">Either C-style cast (e)3  or  function-cast / type-constructor e(3) - seem ok</div><div style="font-size:small">(gcc uses C-style casts and Clang uses this same style in source labels).</div><div style="font-size:small"><br></div><div style="font-size:small">For the duplicate-valued labels case there is no loss of type info,</div><div style="font-size:small">but there is a loss of information about the label used for the auto arg.</div><div style="font-size:small">Presumably, the code works from the supplied underlying-type value</div><div style="font-size:small">and picks the first label with the given value. I'd guess that Clang knows</div><div style="font-size:small">the label used in a direct instantiation and could return it in that case.</div><div style="font-size:small">(c.f. named member-pointer args have to retain the id for reporting).</div><div style="font-size:small"><br></div><div style="font-size:small"><a><div style="display:inline">Question 2:</div></a><br></div><div style="font-size:small"><a><div style="display:inline">Is it possible / acceptable to retain the label in the duplicate enum value case?</div></a></div><div style="font-size:small"><a><div style="display:inline"><br></div></a></div><div style="font-size:small"><a><div style="display:inline">Can anyone point me to the relevant code?</div></a></div><div style="font-size:small"><a><div style="display:inline"><br></div></a></div><div style="font-size:small"><a><div style="display:inline">Thanks, Will</div></a></div><div style="font-size:small"><br></div><div style="font-size:small"><br></div></div></div></div>