<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/66018>66018</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Pointer comparisons in constexpr functions having an unspecified value.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
warp-10
</td>
</tr>
</table>
<pre>
The real situation is rather complex, but similar to the following:
<pre><code>
template< typename TargetPtr_t, typename SourcePtr_t, typename Count_t >
inline constexpr auto MyCopyTo(
TargetPtr_t pTarget,
SourcePtr_t pSource,
Count_t count )
{
// Error: Comparison has unspecified value.
if( pTarget <= pSource )
{
while( count-- ){ *pTarget++ = *pSource++; }
return pTarget;
}
else
{
pTarget += count;
pSource += count;
auto pTargetEnd = pTarget;
while( count-- ){ *--pTarget = *--pSource; }
return pTargetEnd;
}
}
constexpr int Test()
{
int u[]{1,2,3,4,5,6,7,8};
int v[sizeof(u)/sizeof(u[0])]{};
MyCopyTo( v, u,sizeof(u)/sizeof(u[0]));
return 0;
}
int main( int argc, char **argv )
{
constexpr auto v = Test();
return v;
}
</code></pre>
The behavior of things like "MyCopyTo" are well-defined. In this case, the comparison is required for correct behavior where it is being used with overlapping ranges of data.
There is no reasonable workaround. This requires having to re-write calls to things like "MyCopyTo" by either using pointers into a single aggregate array (not always possible), or replacing the calls themselves with for loops.
I don't target gcc, though its behavior is the same here. I consider this to be a mis-compilation in either case.
MSC cl.exe does not report errors.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVc2O4jgQfhpzKYGCQwM5cGhCI_VhpJGm76NKUiTeMXbWP9Ds068qgQR62NVcErtcru-rX6P3qjZEG_GyFS-7CcbQWLc5o2un82RS2Oqy-WgIHKEGr0LEoKwB5cFhaMhBaY-tpk8hcyhiAK-OSqODYCE0BAertT0rU4v0VSQ7kdy-ad46EumbSPPSVt2qOwh0bDUGEmkO4dKSwSPBB7qawvfgfgbGGeQ_bHQl_S7PbTThZ4DBqjJaGYLSGh_os3WAMVj4dslte_mwQq57tXsgaPuNkPn1EOAeENp-83B-Ay75D0JmV29X25uOkHsh9_DmnHUifYXcHlt0ylsDDXqIxrdUqoOiCk6oI81uF9VByPWNFIg0F-nuxmFEArjDAjg3ShPf6whNp53iagtCvg7ubYXcAhtj4c0nFop0C2K1u1pzFKIzQ1TS0aNBBUh7espjoM1Wdz2b0cToxbNTgD5bVxtvpurY_k7kf92dTsfQ7a6Cq7MPbgJ88fTNVCPGoDcuuu9YWMoE-CAfuKaepB86hdg3m1ht50LmUsg8FTJfCJm_CJkvhcxXQuZrBhmg-d5JvGy9-ocs10Jk-3J_t3_ZJmxVZr3th-sA9-UOJ-6XKGT-R-Zk9mDoGqBkEH6JBlM9ojIMxGt0dcl4ZYOOQy_kK7r69LQ_4GuTnrqE3YX0CZPTEyZpLuT-Nlq6zXXg3BHlwVZQgydlHdgDhEaZ2oNWv7gY5RgwCegIzqT1tKKDMlTN4N2wvocSPXXTp6FuGF67mSck_R2VowoOluekc1SGEe_ckCNQgTULUqaG6KmCswoN2BM5jW3LUoemJs_0Kgw4-8KfTXgwlge0twYLTXC27hc6G001g49mJOKBoU3Nw9nR9OxUIChRa9-P6_90vrgAqW7aR8_3W6tMIOc5uxYQWKgJsK4d1RgI0Dm8gJBrYwOgPuPFQ2u9VwX3Z8bhsg4ctRrLjlAzEGno6EmfyPeR4NBpa1v_4Pg7VNYIuQoQ-qauy7LPgY11Ayr4Mc6qMwqeHwaO1wzeuxpTFbk-g8FCQYBwVH7KGVT6-siZm9uc4wcC337kUOoZfRJUljgBgd2xLgDxaPezSbVJqyzNcEKb-TJbLJbZap1Mms2hKvAwX6WrokoW2RqzQiZrWlKSJGmyWs8naiMTmSbZfC5lkibJbJ2UFR3kai5lVmGKYpHQEZWeaX06zqyrJ8r7SJvlMpmvJxoL0v72nrsNK02LWHuxSLTywY_XggqaNt_7bN4VLyf2rg8P0ZQckKF-0Dx5qCbR6U0TQuv5re-euVqFJhaz0h6F3DPq9Tdtnf2LyiDkvmPuhdx35P8NAAD__zAcox8">