<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/87609>87609</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[C++23] [Modules] `-fskip-odr-check-in-gmf` results in "redefinition of concept" error
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jiixyj
</td>
</tr>
</table>
<pre>
I'm testing with LLVM/Clang head (607b4bc602eda79e97a91a9bc3552a6004e5ac47). I have some code where I `#include` _after_ doing an `import`:
```c++
import utpp;
#include <fstream>
#include <numeric>
#include <streambuf>
#include <string>
```
When compiling with `-fskip-odr-check-in-gmf` (which is the default now, I think), I'm getting a "redefinition of concept" error:
```txt
/llvm-project/prefix/bin/clang++ -m64 -stdlib=libc++ -Xclang -fskip-odr-check-in-gmf -Wno-deprecated-declarations -O2 -g -DNDEBUG -std=c++23 -fcolor-diagnostics -MD -MT example/CMakeFiles/utpp_gherkin_feature.dir/gherkin.cpp.o -MF example/CMakeFiles/utpp_gherkin_feature.dir/gherkin.cpp.o.d @example/CMakeFiles/utpp_gherkin_feature.dir/gherkin.cpp.o.modmap -o example/CMakeFiles/utpp_gherkin_feature.dir/gherkin.cpp.o -c /home/jan/git/utpp/example/gherkin.cpp
In file included from /home/jan/git/utpp/example/gherkin.cpp:9:
In file included from /llvm-project/prefix/bin/../include/c++/v1/fstream:199:
In file included from /llvm-project/prefix/bin/../include/c++/v1/filesystem:538:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__filesystem/directory_entry.h:20:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__filesystem/filesystem_error.h:15:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__filesystem/path.h:30:
In file included from /llvm-project/prefix/bin/../include/c++/v1/iomanip:46:
In file included from /llvm-project/prefix/bin/../include/c++/v1/istream:170:
In file included from /llvm-project/prefix/bin/../include/c++/v1/ostream:188:
In file included from /llvm-project/prefix/bin/../include/c++/v1/format:194:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__format/container_adaptor.h:20:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__format/range_default_formatter.h:23:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__format/range_formatter.h:23:
In file included from /llvm-project/prefix/bin/../include/c++/v1/__format/format_context.h:30:
/llvm-project/prefix/bin/../include/c++/v1/optional:565:9: error: redefinition of concept '__is_derived_from_optional' with different template parameters or requirem
ents
565 | concept __is_derived_from_optional = requires(const _Tp& __t) { []<class _Up>(const optional<_Up>&) {}(__t); };
| ^
/llvm-project/prefix/bin/../include/c++/v1/__ranges/movable_box.h:21:10: note: '/llvm-project/prefix/bin/../include/c++/v1/optional' inclu
ded multiple times, additional include site in header from module 'std.<global>'
21 | #include <optional>
| ^
/llvm-project/prefix/share/libc++/v1/std.cppm:14:1: note: std.<global> defined here
14 | module;
| ^
/llvm-project/prefix/bin/../include/c++/v1/__format/format_context.h:30:12: note: '/llvm-project/prefix/bin/../include/c++/v1/optional' in
cluded multiple times, additional include site here
30 | # include <optional>
| ^
```
When compiling with `-fno-skip-odr-check-in-gmf`, it finishes compiling without error. Which is curious, since I had assumed that enabling `-fskip-odr-check-in-gmf` would always result in less errors, not more.
Another data point: on LLVM/Clang from 2024-02-22, this compiled without error without any additional compiler arguments.
So now, I have to do one of the following to make the error go away:
- Specify `-fno-skip-odr-check-in-gmf`
- or move the `import` _after_ the `#include`s
Has anyone an idea how/why this could happen? I could try to bisect this, but this could take a while...
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWF9z47gN_zT0C0YambIk-8EPSRy1mbm0D3fX7ZuGIiGLG4lUSSqOv32HlPwn22Z3e3veOp6MRVIAfsCPIEBmrdwrxC3J7km2W7DRtdpsP0v5dvy8qLU4bp8ILXpwaJ1UezhI18Ivv_zjmdDyoWNqDy0yAYSu86SoVzXPE4qCFRvcFGyzZJuap1lGWZ4kK8wYXxWEbmJ4gpa9IljdI3AtEA4tGoQnIHlCaCoV70aBJE-gYo1DU4HQXj1TfoXsB22cX5rekWRHktP_PJm-nNB7_w2j02oY3TCQdB676ACSPjTWGWQ9SR__26waezSSfzA7vVqPzcfzUu0vkycTr-3-1KICrvtBdmcfkzyJGvsih0gLE_EW-UskVbTvG-8VQteHVvIWpAXXIghs2Ng5UPpA6AM8gWuleiF0E55CBPfoQgQZEEoNCmykkk5qBboBrhXHwRFKAY3R5iPHujd3All23WsfDUZ_Ru4ILQeDjXwjtKylIrTknhxTGAAg6vMVRNaJTtYk3XWynkME0T_DSvgALESflI4EDgY5cygigbxjhnnDLUR_pxDtIdr9bfd4__tfggaS7mbZNIWo4brTJhKS7ZW2TnIL0fMOouffAN9YP3ToifzMXrCUHVpCS8-Tat-ieZGqapC50WAspCG0nEdjPgyxhui5_FEZsQCySn5USK9FzwaI9I9D4kBo2erei_jMfBz30s0SCC0v8q_emwjxpKCRHcJMfQGN0f0fkZbebc7s-1Do17kXx4SWpxxCy1M2oOXrktDyvNvvlhuvCm6py0fgaB16dVm6vrG6qrpSSEshDXKnzbFC5cwxbkl6R5Ofa8PloQqZJRixzH6uEQNzbVCc3hq91D1T0rN4ld9a1YXHxa1h6Yuu9frG21ObnrmwO1e31VRVsy5acq0ckwpNxQQb3ExTmvw0AwxTe6zmY3wedjibkf5kM_5v6qcflY8GvrnLjv3OmuMbHB580cA6n4nzbD5nzuUOfFASAaFFVUlbCTTyFUXlIVdnWbSYyjUhmwYNKgcO-6FjDmFghvXo0FjQBgz-a5QG-wkKKmenXwBZngEpHs4KP9YGJN2dBFlC11wr66D6bSA0h6pyhG6AFPcwFfMkfeAdsxaq3wdff57WX_zwcJrJ5zdJsSN0PUki6T3451PJDOHjDSXZ458SkKoKdPMVSq9fWd1hVeu3iXNLnwBCVlPaYchutPizCECLicETCs_jfuycHDoEJ3tv0AMwIeTs9VM1b6Xz1A8dD5qJ-70WY4feOOtETNKHfadr79tHb-_JcXQ5Oe5dZ3CJw-Mf8bBtmfEgL7X0Cae3hA9DyNY-hS6v3filmRBYjwJ8A3a2Y7kKdkzobkqBb-79Jb0lCyYUczb7fha8c1aanKIL8H3xvfpcPPk_dYZKRx81h95u6cDnMtui_eJ1Pbop58Xw6dRB8tFIPQbAViqOoT0XwKwdexTgWuYAFauDkK83pgc9dgJYd2BHCwatb0qlgg6tndQGLUo76LXB-BrrndKuRQOCOQaDlsoXAaDV--uGsOtoQldRQiNKvTTXyhNKFO9Bnp-YOl4Hc15tgJn92Pts_M6UX_Wlkw4XFU6D0KAV-pPBN9yN7jp98P5wGnr2gmF00rnXwA7s-EUPHcGvA3LZHL8dwHm9NtDr10ny9a3H-U5knnh3YWKvdf6VWY_c280USIEMWo-rPLTHk9t8vFo2DKhIWsLTPOLM0SOrpUXuwlLvjXp01685j5vBoZUdxnG8ENtUbNINW-B2WSwpXW5oni_abZFnebJcr2myTES2FLTOak75KmuKZcb4ZiG3PqKJ_1vTYpXFmCfpJlmt-AbzdbbMfJfcM9nFfufH2uwX0toRt-siTzaLjtXY2XCHRanCA4RJQinJdguzDdmiHveWrJJOWmcvUpx0Xbj8ejhdGZBs58_P55D5bHj6KuEnjltP8u-4V1mMptu2zg3Ws4OWU0vcjnXMdT8ntv_MbwGOPyYD3H8HAAD__2XSMwo">