<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJzdF9uS2yb0a-QXRhoJybcHPzjaOJOZ7aTJJtP2yYMQsmkwqIB2vfn6noPk616StnmqB2PDuR_OBSpTPy6UrHhE38AgtRGOaOPha3dMyW-C-K0gmu0EMQ3hRjtvO-5FTZThTAkX0RJQOkeYUuZB6s0BQB6k3wZKBwjME2ZFYO2EamKhOWtdpxiy8oZUgnArcJWQu45vj1xAvAbolt0LUsumEVZorx5J1XlQZ9ciV_FXx1QSpTdRuuzn9wBkGnRygbXcsY3UKAkVcci_V-zBdKoG1M6BfLDAoS7RJO2lR_kSxkaZiqmIziI6BxBiOOGDX8pBTSJBFnlgj72AXl13oS8AdKAZKFrmXG86bqLsCwM-aAUKBwulEpbA6ivoQrbetw71oisYG1NXRvnE2A2svsH3j8ZUv-yLzJwziyiOO9NZLggaMkmjvHS-ljrK3-IKLMsHtIEENvsxcMhr0aBG618_3L3_fV2u7z58-VS-JTRNs4zeHtGk5qqrQUxecjTRehTxHNQ_tiLZvgA9HMCzQNTcvEgKUIjoM7DUnuwY2Epn90bWYCyJpm96GMGzFPo-HC-9LdfL21v4g1ENP0Kvv9wlXz6v4tmwmQVXnYh93QfJcKrLnbCSs55bGCfsHxFY_piYd0KjnFfFhFwlfMsskNto_CYa34B7blBMVKTpkuGfk4wen3UQkTtj2y0EJ2AfoPg5agHZsm4YF773dr_JjcJsxpMFmeh8GHR29Mg88ZZp10BhgW1UCeyEH4J1p7i090yXTW8qVKKfo8_Rdf9Sn9ZCOFWQ78GVwatAfoYQ0UlgdhFkhIAcTL1wHpxgKj-HRYhsQobSrLdCuiAQKVGlp_jAOWA0wYhaWDuEUjQuYewjOk7p_hhhs047uYFSGLgdVyFOYItf2t1_wDgvdSeuANH04jReUoOO-SD9CfMLDi-boa8ivCc8rQ5HAqRD5F5in8HPoukSZyhV6PlDyJJwCDenZEPflzDISVAIScC54nuejgcbrytqmMtDfZf6HlLbS6Px3J8j4IrpzdCm477GgeSz3h3_Bk0EZrGHwCZxK2oG58Zj8KWxjsSGsMRA14z35Ejyimp9N_jU6TPdsB_tmK5fbxYJ9KEg6rvcl9xD5yYWhAB6CxSvMn738SOGdJqFmT6Zz_enT_bDzMM-G592RMCZhXleXe-zsDMT1_vzIsx00LOvp-F_bznk93mLzZc5JjQ5a0V9zyXLEHjo29CHf0bwTUnDIKjq5Lv-f7tvRbjM_a9O4BWDj_l2L6xDp0vdmOFKdJFg9z9yKwoUR1bZOEmTFJldXdLgHtxVCaQOLJS6P_zErTV_gvsTQCBVQ5spbViWiryYzKuiySo-YbNxBkV5mk4LPhnzpgp1MMj-zOxGhDjbzybrSRF3-qs2DzqGm2K3jze6G_C2cK2uoaXXQiF2a5zcD5dk6FlQMkR9I20IWLoyLdTA1QOkeGWgaayChfEWOMACS2ggXJlO461Z17KGFkvelSU4MjA7lDBk1jmLpkKdAidwiOHVoOpJRboazLkTqo_En8CrPCq265SXoVAuSYIluUh3k-JK4mtIxwMf1Yu8nudzNoImvzV2AUcKeRtbASktbGuFh-uuH3VWLf7Z8cNSOtfhS2o1zqfz6Wi7yOoim9cTzudpXswZ59NpkU8K1hSUU0HHI8UqodwC7x-UnnpA6Jc3o_-uglzQlMLI8jRN83yeiKaa0oyKNKcTls1m4CQBhUwlyAffHyO7CCyrbuMAqKTz7gSE9or3DLHob0wjL70S5w_P03OPXb3rwkvv6QNwFDReBHX_BkaXQMM>53797</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
libc++ locales that compare equal but behave differently
</td>
</tr>
<tr>
<th>Labels</th>
<td>
libc++
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hubert-reinterpretcast
</td>
</tr>
</table>
<pre>
libc++ does not normalize the name of constructed locales, thus allowing locales with names that are not self-encapsulated to be created. Such locales then behave differently but compare equal.
It can also be imagined that such names would cause calls to `locale::global()` to set the C locale in a way that behaves differently than the locale passed to the call.
Online compiler link: https://godbolt.org/z/YfobMx41o
**Source (`<stdin>`):**
```
#define _POSIX_C_SOURCE 200112L
#include <cassert>
#include <ctype.h>
#include <locale>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
setenv("LC_ALL", "en_US.UTF-8", 1);
std::locale America("");
setenv("LC_ALL", "C", 1);
std::locale Generic("");
const char str[] = "@0Aa";
const auto morphed =
std::use_facet<std::collate<char>>(America).transform(str, str + 4);
const auto genericized =
std::use_facet<std::collate<char>>(Generic).transform(str, str + 4);
const auto printbin = [](const auto &str) {
for (char c : str) {
if (!::isprint(c)) {
fprintf(stderr, "\\x%02x", (unsigned)(unsigned char)c);
continue;
}
fprintf(stderr, "%c", c);
}
fprintf(stderr, "\n");
};
printbin(morphed);
printbin(genericized);
assert((America != Generic) || (morphed == genericized));
}
```
Compiler invocation:
```
clang++ -stdlib=libc++ -Wall -Wextra -pedantic-errors -o a.out -x c++ -
```
**Run invocation command:**
```
./a.out
```
**Actual run output:**
```
GQQ\x01\x02\x02\x02\x01\x02\x07\x02\x01\x01\xc7\xa5\x01\xe2\x82\x9b\x01\xe2\xab\x8e\x01\xe2\x94\x92
@0Aa
a.out: <stdin>:31: int main(): Assertion `(America != Generic) || (morphed == genericized)' failed.
```
**Expected run output:**
```
GQQ\x01\x02\x02\x02\x01\x02\x07\x02\x01\x01\xc7\xa5\x01\xe2\x82\x9b\x01\xe2\xab\x8e\x01\xe2\x94\x92
@0Aa
```
**Compiler version info (`clang++ -v`):**
```
clang version 15.0.0 (https://github.com/llvm/llvm-project.git bf2f72fa10e3469b4f1bc6a85129c7074c65cfb2)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/wandbox/clang-head/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Candidate multilib: .;@m64
Selected multilib: .;@m64
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdF8uS2jjwa8xFZZeReR44EE9IpWq2sskktbsnSpZl0EZIXklmmHx9umUDhnlkdmtOSwmB1O9WP6TClA8LJQse0XcwSGmEI9p4-NodU_KHIH4riGY7QUxFuNHO24Z7URJlOFPCRTQHlMYRppS5l3pzBJB76beB0gEC84RZEVg7oapYaM5q1yiGrLwhhSDcClwl5K7h2xMXEK8BumV7QUpZVcIK7dUDKRoP6uxq5Cr-aZhKovQmSpft_BGATINOLrCWO7aRGiWhIg75t4rdm0aVgNo4kA8WONQlmqSt9ChbwtgoUzAV0VlE5wBCDCd88EveqUkkyCL37KEV0KrrLvQFgA40HUXNnGtNx02UfWHAJ61A4WChVMISWH0HXcjW-9qhXnQFY2PKwiifGLuB1Q_4_lWZ4rfDaGj6zCKK4840lguChkzSKMudL6WOsve4AsuyDq0jgc12dByyUlSo0fr3T3cf_1zn67tP377k7wlN0-GQ3p7QpOaqKUFMlnM00XoU8RTUP9Qi2T4DPR7Ak0DU3DxLClCI6B5Yak92DGyls72RJRhLoum7FkbwLIXeh-Olt_l6eXsLfzCq4Ufo9be75NvXVTzrNofBVWdiX7ZB0p3qcies5KzlFsYZ-zUC89eJ-SA0ynlRTMhVwrfMArmNxu-i8Q245wbFRKM0XTL8c5bR4rMGInJnbL2F4ATsIxQ_Jy0gW9YV48K33m43uVGYzXiyIBOdD4POTh6ZJ94y7SooLLCNKoGd8EOw7owu7e3psmlNhUr0NvqcXPcf9akthFMB-R5cGbwK5D2EiE4Cs4sgIwTkYOqF8-AEU_kpLEJkFTKUDlsrpAsCkRJVeowPnANGFYwohbVdKEXjHMYhouOUHk4RNmu0kxsohYHbaRXiBLb4pd3tB4zzUjfiChBNL07jOTXomHfSHzG_4PC8GfoqwlvC8-p4JEDaRe4ldg_ei6ZLnK5UoeePIUvCIdyckw19n8MgZ0EhJAHnim8_HY82XlfUMOfH-i71HlLbS6Px3J8i4IrpTdem47bGgeRe747_gCYCszhAYJO4FiWDc-Mx-NJYR2JDWGKga8YHciJ5QbW2G3xpdE837Ec7psuXm0UCfSiI-iX3JffQuYkFIYBeA8WLjD98_owhnQ7DTB_N_f3po_0w87DPxucdEXBmYZ4X1_ss7MzE9f58FGba6dnW0_C_tRzyu99is2WGCU16rajtuWQZAg99G_rwWwTflFQMgqpMfun_94dahMvc_-oEXjD4lG97YR06XerKdFeiiwTbv-ZWFChOrIbjJE1SZHZ1SYN7cFMkkDqwUGp__Ilra_4G9yeAQIqKVlNasWEqstFkXoyqYcEnbDYeQlGeptMRn4x5VYQ6GGR_ZXYjQpwdZpP1ZBQ3-rs29zqGm2JziDe66fC2cK0uoaWXQiF2bZw8dJdk6FlQMkR5I20IWLoyNdTA1T2keGGgaayChfEWOMACS2ggXJlG461Zl7KEFks-5Dk4MjA7ljBk1jiLpkKdAidwiOFVp-pZRbrqzLkTqo3EN-CVnxTbNcrLUCiXJMGSPEp3k9GVxJeQTgc-KBdZOc_mbOClV6L_Zjq_VNjVkyQ8Uh6_XQaNVYt_FyOwlM41-NxajbPpfDrYLkYFK6s5o9OUw90nm7BqnEIUM1bOeToeTwaKFUK5BV5SKD0rHJrqzUAuaEphDLM0TbNsnoiqmNIhFWlGJ2w4m4EfBNQqlaAi-MQY2EXQqWg2DoBKOu_OQOigeJUQi_ZSNIDL0NbYBZgF9S22AkqfsLUVHp4FfhCsWQRTfgLKhCwl">