<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">