<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/151081>151081</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LLVM 21.1.0-rc1 C++ Standard Library Compatibility Issues
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chatgpt-copypasta
</td>
</tr>
</table>
<pre>
**ISSUE**
LLVM 21.1.0-rc1's libc++ introduces template metaprogramming changes that break compatibility with large C++ codebases and C++ binding generators, specifically around `std::invoke_result_t` and `std::basic_string_view` template instantiations.
**EXPECTED BEHAVIOR**
LLVM 21's libc++ should maintain backward compatibility with existing C++ code patterns used in major projects, or provide clear migration paths.
**STEPS TO REPRODUCE**
**Environment:**
- LLVM 21.1.0-rc1 on macOS aarch64
- Large C++ codebase (Firefox, ~10M+ lines)
- C++ binding generator (rust-bindgen)
**Template Usage Patterns That Break:**
```cpp
// 1. Complex invoke_result_t instantiations
template<typename ResolveFunction, typename ResolveValueT>
struct Promise {
using resolve_result = std::invoke_result_t<ResolveFunction, ResolveValueT>;
};
// 2. basic_string_view in template contexts
template<typename CharT, typename Traits = std::char_traits<CharT>>
class StringProcessor {
std::basic_string_view<CharT, Traits> view_;
};
```
**Compilation Context:**
```bash
clang++ -std=c++17 -I/opt/llvm-21.1.0-rc1/include/c++/v1 test.cpp
```
**ATTEMPTS TO RESOLVE**
**Analysis of Template Changes**
Compared LLVM 21 vs LLVM 19 template definitions:
**LLVM 19 (Working):**
```cpp
template<class _Fn, class... _Args>
struct invoke_result : public __invoke_result<_Fn, _Args...> {};
template<class _Fn, class... _Args>
using invoke_result_t = typename invoke_result<_Fn, _Args...>::type;
```
**LLVM 21 (Problematic):**
```cpp
// More complex SFINAE and template parameter handling
template<class _Fn, class... _Args>
struct invoke_result : public __invoke_result<_Fn, _Args...> {
// Additional template metaprogramming complexity
};
```
**Impact on Binding Generators**
Binding generators (bindgen, SWIG, etc.) fail because:
1. **Template Parameter Extraction:** Cannot resolve `_CharT`, `_Traits`, `_Args` in complex instantiations
2. **SFINAE Patterns:** More sophisticated SFINAE in LLVM 21 breaks simple template parsing
3. **Nested Template Resolution:** Deeply nested template hierarchies are not properly resolved
**OUTCOME AND FINDINGS**
**Compatibility Regression**
LLVM 21 introduces template metaprogramming changes that are:
1. **Semantically Equivalent:** Same runtime behavior as LLVM 19
2. **Syntactically Different:** Different template instantiation patterns
3. **Tool-Breaking:** Incompatible with existing C++ tooling ecosystem
**Affected Template Types**
1. **std::invoke_result_t** - Core issue in complex template instantiations
2. **std::basic_string_view** - Template parameter resolution problems
3. **std::enable_if_t patterns** - SFINAE changes break some use cases
**Ecosystem Impact**
This affects:
- **Firefox** (confirmed failing at 58% build completion)
- **Other large C++ projects** using binding generators
- **C++ tooling ecosystem** (bindgen, SWIG, etc.)
## **REQUESTED ACTION**
**Immediate (LLVM 21.1.0 stable)**
1. **Template Compatibility Audit:** Review template metaprogramming changes for backward compatibility
2. **Binding Generator Testing:** Test LLVM 21 against major binding generators (bindgen, SWIG, pybind11)
3. **Documentation:** Document template changes that affect tooling
**Long Term**
1. **Template Stability Policy:** Consider impact on C++ tooling ecosystem when making template changes
2. **Binding Generator Liaison:** Coordinate with binding generator maintainers on template changes
3. **Compatibility Testing:** Add major C++ projects to LLVM CI for compatibility testing
**Specific Technical Review**
**Files needing review:**
- `libcxx/include/type_traits` (invoke_result_t implementation)
- `libcxx/include/string_view` (basic_string_view template patterns)
- Template SFINAE patterns that changed between LLVM 19 and 21
**Questions for LLVM team:**
1. Were the template metaprogramming changes intentional compatibility breaks?
2. Is there a migration path for binding generators?
3. Can template instantiation patterns be made more tooling-friendly?
**Priority:** This will block adoption of LLVM 21 by major C++ projects that rely on binding generators.
**Note:** This is not a request to revert changes, but to ensure ecosystem compatibility is considered in template metaprogramming decisions.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEWE1z4rrS_jXKpiuUMSGEBQvCx7xUZZKcwMy8O0qWG6wztuQjySRs7m-_1ZZtbAiZOqtblapgW2p1P_30l7i1cq8QJ2z4yIbzG164RJuJSLjb5-5W6PyYc-v4TaTj44SFUxZOV-v1j4X_yQL6e3r6-R3Cfq_fC26N6LNwZCGVkWDhIwsfQSpndFwItOAwy1PuEDJ0PDd6b3iWSbUHkXC1pwUJdxAZ5L9B6CznTkYyle4I79IlkHKzR5hVcoWOMeIWLXAVN28jqWKSuEeFhjttLAtnYHMUcicFT9MjcKMLFQO7D6yL2WDKBlOpDvo3bg3aInVbx-6DUmh7ScStFFvrjFT77UHiOy1qDJLKOq6c5E5qZXseGA_S4v9fF7PNYg6Pi_-b_ly9vH2C3TlmNtFFGkPGpXJcKoi4-P3OTfwZKvghrSOT28BAzp1DoywUFmOQCjL-tzaQG_03CleC4h8PMkYQKXIDmdyb0gDanXStWG8Wr2vYvMDb4vXtZf5j1qFAZak6SKNVhsoRZvX3WzhjCGhSR7ysgXMjkvs7v-hT7wILH5bS4E5_kM7_6Qff6XMqFVoWjsudV31Pm01h3S192aPyGxp9N7X3fli-R3itIdsQCx-JhW0z2H3g_0SelyKWLFxCvwczneUpfsAZic44wYJpzRY2mLljjopnCG9odXrAZaEELSMbz7_95GmBGzZYsGBqnSmEg1ejM0ngjB5ZMAUAKCxZbvyOSgdggzlc5fhg9snZF0cO6AA2mlc_GrvDHlxEBNGsiQihlcMPd83uWcLNpmPtxnDpbFdnkXCzdeUHNpj5PaQUQSFSbi2sy-NfjRZoLXncI_JF2NZywll1JBssgL5sz42tHd7mDDlbpj5KZt7ET0kScZt4JdW-oudtqdS8ivH-CG5XLFzq3LFwmaaH7LadQ5dSibSIkYXLagMLl4c-OLSuVzGwqx94JaabzeL766aK1fXL089PInWqeHq00oLeQRMFM5-Em9VkKjcY1-ELB-t_9scnN8e4k0p6hg86Z9RLWfjwS5vfknAYfxFQLZZ4126XJSXLh16vB9up2dtOGHQoDWwwhbyIUilgu-18YoNZJayU0ev1yOdElRax_835PtrOA56o29D5zwp4gtKGL_hWY8_Ch1ejoxQz7qT4GskqRL9rg2XBoOS0Xq6ep4uyqjW-y7nhGTo0kHAVp-Sh_5EbSvaWSk_juGQTT7_oFrxN0h2_CNcqHFZZzoWjivNYVYdvrc6gwu_xomkgvJuiMYP1r9U3-o9O9Fg4hh2XKUQoeGHR077fg7Oi8tqgu_hwhvsUWzsNZlwp7eqETZ3G1qel-4AOoucqO51elMDfB5RmRVNzzmpMWOtRObwuaqeTS1pYnSfUNgjuMK7JIVUT6mUPZsFKOqbDGOtpMqjPeUZLIhqzywpSdI2dI-bpEZRf2khLJBpqACT1cAaBAMmNztGkxxqZuB0MLz82s5fvC5g-z2G5ep6vnr-tL5PbrNMjveHeoLVlfatW1kb-686Um3NvrzEj-H1jufinkAeettsfWFMuMIVyMkOIMOEHqQ3wJpN2XHZUjnjipc3lboemI6x5daXxbLq-toM2Wqe3ZTdDnmtkrVTdS6Z4pZF0WlNSABTaHq3DrFNCdjsUHc9vjnmrejQQXW1AvB63MCNCSmsLbDP7SmvdxuuLIl_L3lzmOtMQlMhGGbUDVyMUFY9S3Mrd1p1wreVWEVOzw48sVmdI_TYIGks6nXGNIPh81KC0SaQFXkJZ1c_bSo-m6S1PZOGD0GonTYZxmX3IL9zB8IGFQ4gKmcYVcr6TG7ckvbgEzdnwdJoDSvG-nn0yO52kXCdFo-H1hFljMWDhoJL3tvjrx2JNc9F0tlm9PF_G8SrLMJbkPBY-tEYIsI48Q2IvyHZqZjpJYFrEshVHb1i2q38M-p02V0avNg0vCgtssAyk04H0osmtfM-J09VEdgn6FSjzI73s9z2cDV_nWhQ0cfGzlFu9bjXknUxWUq52ZqdiPmm1hw2a7At0145XyL7qVIpjq65pZWWMBmRTeK8yB94TpEmQEtOFnl8j_CS5tJ16qrWJpSIBZTK7nAXrYRqNJa0-Oa_BtEueC29O47hy3nk4gdPezbNVSZ7uuO4qQe2xurqYgA2KRFHmr8h5CocqG6RoQSHGfszzk0x7xmb3QSoj8fHRmR2ou6wHqPuAmHUxpVLSOBGozhyfSju7_SCeXsyArV6hzple5Ik8Pnc2NxQlIb0XYojQvSOqZtCghjXstyH7qyAYtfLhWa5zyLM2Gv0e_EKD4BL8c5BL5VBVLWfXX74JYoOl5-KKVCWx_OymxOeJy-RZbhz0qNf7U8GGCCHjMUJGxbCKlNudkaji9OglNQi8GqkNJaFTfqEy8i7TFKJUi9_AY52X8vXu1NIdr5KWHGAwPVJcXNrRuQd61g7PzpW27Nw4GPyHfENBYPCAxjWxFc4gKsoPqGxhsJUDupBLC6LKIP7a6qr7YhTS1pdtN_FkEI8HY36Dk_5oOBjd398N-zfJZBTsxPgO73bR6J6P-eAOx-N4JMa7EQYPsYhu5CQMwmEwCsfBMAyG_V7QH45HD4KL3d1w9BDcsbsAMy7THo3oPW32N2WrMukP-8FD_yblEaa2vD8NQ4XvvpFhYciG8xszKef6qNhbdhek0jp7EuOkS3FyfjVWO2ftuIqp7DzJyHBzPCtoKzrF3hQmnSTO5b69pwFqL11SRD2hs-pWob5cqLxN8VzuZeGyMuEwCf8bAAD__8KFEkw">