<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98021>98021</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
C++ modules appear to be exceedignly strict with intrinsic headers
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
chriselrod
</td>
</tr>
</table>
<pre>
That is, code using `immintrin.h` tends to fail to compile when using modules while working fine with headers.
I'll try to produce a minimal example in the next few hours.
For now, I have an example using boost_unordered.
When problems showed up in my own code using intrinsics, I could generally fix it by declaring all arguments as variables, and then passing the lvalues to the intriinsic function.
Hello.cxxm:
```c++
#ifndef USE_HEADERS
module;
#endif
#include <boost/unordered/unordered_flat_map.hpp>
#include <iostream>
#ifndef USE_HEADERS
export module Hello;
export {
#endif
void hello() { std::cout << "Hello World!\n"; }
template <typename K, typename V> using map = boost::unordered_flat_map<K, V>;
#ifndef USE_HEADERS
}
#endif
```
user.cpp:
```c++
#ifndef USE_HEADERS
import Hello;
#else
#include "hello.cxxm"
#endif
int main() {
hello();
int x = 0;
long y = 0;
map<int*,long*> m;
m[&x] = &y;
[[maybe_unused]] auto f = m.find(&x);
return 0;
}
```
Compiling with headers:
```sh
$ clang++ -std=c++23 use.cpp -DUSE_HEADERS -o Hello.out
$ ./Hello.out
Hello World!
```
With modules:
```sh
$ clang++ -std=c++23 --precompile hello.cxxm -o M-hello.pcm
$ clang++ -std=c++23 use.cpp -fmodule-file=Hello=M-hello.pcm M-hello.pcm -o Hello_mod.out
```
results in
```
/usr/include/boost/unordered/detail/foa/core.hpp:293:7: error: no matching function for call to '_mm_cmpeq_epi8'
293 | _mm_cmpeq_epi8(load_metadata(),_mm_setzero_si128()))&0x7FFF;
| ^~~~~~~~~~~~~~
/usr/include/boost/unordered/detail/foa/core.hpp:309:14: note: in instantiation of member function 'boost::unordered::detail::foa::group15<boost::unordered::detail::foa::plain_integral>::match_available' requested here
309 | return (~match_available())&0x7FFF;
```
I could file this as a `boost_unordered` issue or make a PR there, as I've generally found I can work around the problem.
But I'll see about creating a minimal reproducer using `#include <immintrin.h>` directlry that works with headers but fails with modules.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVknv274R_TT0ZWBDprwefPDPtpCgKFAkbXM0KHFkseGicPHSQz57QUq29VuC_jdDsMRlhsP3hsPHnBMnjbgh8xcy349Y8I2xm6qxwqG0ho9Kw2-bfzbMg3CE7qAyHCE4oU9AFplQSmhvhZ40ZJGBR80deAM1EzK-K6NaIREuDereShkeJDq4NGnA2O-xtxYa4SJ8Aw0yjtZNSLYn2fYzoUspwdtbdNdaw0OFwEAJLRSTgFemWokgNPgGQePVQ40XaEx4-CiMBW0uMfrP0LAzAtMPwy6o0hjnj0Eby9Ei7w2_xahba0qJyoFrzAU5hDYupm5gLnqIRoeDE5XrFqpMkBxOqNEyKW9QiysID-UNOFaS2WjDpARmT0Gh9g6YgzOzgpUSkw-medyUhjbSpE9ph_LMZMAEcmymVdOyUAddeWF0H3z3_wmlNJPqelUk77vIIuueitCX-HS9NBe15ljDv74ejp8O2_3hy9duqGOM5M-ZqLmon3a6koEjkHyXcCS0eCA5_D7WkvmjYu2kaVuSHz5yIIzzFpl6Dv-_6PDaGuv7tIK030eo_RhZfhg6wNkIDk0yoStC13EmOM8jVvm2MsHHmEi-A0Jpcg3fjJWc0CmZ7zShlOQvQJb73qFH1Urm0078rUXNFMLfIpeP1r9JfrifBNYCyfdd8nVLvseK5LvkINoNKfgVHI9g3tB0J71rBod2UkUW_mhSCJWgfY13XFM6fE8spc0zESn9MMLOrfagmNBPPu5cDWh6rAcx_-GaUMwGvdLoE9zedXdwCu0J3RK6i7PiV34ANZwVayFdXMl8nzwQurg9h1OhfFHsVuIx6OCQk_k-TmUh1r1koSa10DzFuri-jteiD1YPonry9Zqh7n-X6mdMlmFtfM-aa-6QzqCSLO4rsgjjlMz7nlSaQ3AYeYfxfsAojE1H5MQE_3Q0IbR40_3mDHwU-LcYaF_k_0Sg43Fr8X59PJMnhvr3cdduK_V7d113gY1rEQvavs_e_cDj0PsDl6MyfIDN6w1bdEF6B0J_TCQtgrOEFv1hILT4qEpy9ExIQovaMEKLyljsyuSWrnOSb5ck3wJaa2z80AYU81WTrs6-7kNtLFTxSvEGCF0elTpWqsUfR2zFitDlPQfpOgey3MHbCStpGD8q9Iwzz_qjRndxmkP_X7Tm6MQ0dncj3bPIrsuiKAY5Hn_RP5kffg5_fxEeebYm-XY663DwGN9Cg9DOM-0FS1iYGhSqEu0THkKXH1Xartkvl77jiunjZE1op_PHvfabDVvJhD4K7fFkmUyVO3Ynyo7szISMlzyhS7D4I6DzGK8hi3cE82ydEIy_vmIQuvr5zn71KxLe5OBdjcS0B9-IpDVYFHBvhE8UccK5gGAsKPY9Sq1_fIlKw2KSJA6iIjvjUNiYoHkUPEwnOQfMpp4oT3rx1EuSl-ChF3QOEVgZL9jKIvNJDD1EncVe6Nmn0nwjEwa6Mz_EqLmwWHkZdWIUqzEQ96poQhl80qV9d1-iJiO-yfk6X7MRbqZLms1m83wxGzUbxJqv5ljNpzWdLeqyWrN6WVZlmZXzdVnNR2JDMzrLltlqmtM1nU1qRrFcZlOcTvlswZDMMlRMyImUZzUx9jRK2G7Wq4xOR5KVKF1S3pRqvHTAx9txvh_ZTbQZl-HkyCyTwnn39OKFl7jZ9dXuLqhZ2yKz8fCXCHitELk4aXkD562ofLfrh0q9wzIKVm4a79tUrGlBaHESvgnlpDKK0CIu2r_GrTX_wSqe1BSqI7TotnLe0P8FAAD__22RxkI">