<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/130080>130080</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [C++23][Modules] imported function with auto return type causes lambda does not satisfy 'move_constructible'
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          thbwd
      </td>
    </tr>
</table>

<pre>
    A.ixx:
```c++
module;

#include <vector>
#include <ranges>

export module A;

export auto f(const std::vector<int> &vec) {
    return vec | std::views::transform([](int x) {
        return x + 1;
    });
}

/*void clang_bug_fix() {
    for (auto x : f(std::vector<int>()));
}*/
```
main.cpp:
```c++
#include <vector>

import A;

int main() {
    for (int ptr : f(std::vector<int>(5))) {
 }
}

```

Produces:

```
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/clang++ -g -std=gnu++23 -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -fcolor-diagnostics -MD -MT CMakeFiles/test.dir/main.cpp.o -MF CMakeFiles/test.dir/main.cpp.o.d @CMakeFiles/test.dir/main.cpp.o.modmap -o CMakeFiles/test.dir/main.cpp.o -c path/main.cpp
In module 'A' imported from path/main.cpp:3:
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__ranges/transform_view.h:184:16: error: constraints not satisfied for class template 'transform_view' [with _View = std::ranges::ref_view<const std::vector<int>>, _Fn = (lambda at path/A.ixx:9:40)]
  184 |   friend class transform_view<_View, _Fn>::__iterator;
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__ranges/transform_view.h:97:53: note: in instantiation of template class 'std::ranges::transform_view<std::ranges::ref_view<const std::vector<int>>, (lambda at path/A.ixx:9:40)>::__iterator<false>' requested here
   97 | _LIBCPP_HIDE_FROM_ABI constexpr __iterator<false> begin() { return __iterator<false>{*this, ranges::begin(__base_)}; }
      | ^
path/main.cpp:6:18: note: in instantiation of member function 'std::ranges::transform_view<std::ranges::ref_view<const std::vector<int>>, (lambda at path/A.ixx:9:40)>::begin' requested here
    6 |     for (int ptr : f(std::vector<int>(5))) {
      | ^
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__ranges/transform_view.h:68:30: note: because '(lambda at path/A.ixx:9:40)' does not satisfy 'move_constructible'
   68 | template <input_range _View, move_constructible _Fn>
      | ^
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__concepts/constructible.h:39:62: note: because 'convertible_to<(lambda at path/A.ixx:9:40), (lambda at path/A.ixx:9:40)>' evaluated to false
   39 | concept move_constructible = constructible_from<_Tp, _Tp> && convertible_to<_Tp, _Tp>;
      | ^
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__concepts/convertible_to.h:27:69: note: because 'static_cast<_To>(std::declval<_From>())' would be invalid: no matching conversion for static_cast from '(lambda at path/A.ixx:9:40)' to '(lambda at path/A.ixx:9:40)'
   27 | concept convertible_to = is_convertible_v<_From, _To> && requires { static_cast<_To>(std::declval<_From>()); };
      | ^
In module 'A' imported from path/main.cpp:3:
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__ranges/transform_view.h:187:16: error: constraints not satisfied for class template 'transform_view' [with _View = std::ranges::ref_view<const std::vector<int>>, _Fn = (lambda at path/A.ixx:9:40)]
  187 |   friend class transform_view<_View, _Fn>::__sentinel;
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__ranges/transform_view.h:68:30: note: because '(lambda at path/A.ixx:9:40)' does not satisfy 'move_constructible'
   68 | template <input_range _View, move_constructible _Fn>
      | ^
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__concepts/constructible.h:39:62: note: because 'convertible_to<(lambda at path/A.ixx:9:40), (lambda at path/A.ixx:9:40)>' evaluated to false
   39 | concept move_constructible = constructible_from<_Tp, _Tp> && convertible_to<_Tp, _Tp>;
      | ^
/opt/homebrew/Cellar/llvm/19.1.7_1/bin/../include/c++/v1/__concepts/convertible_to.h:27:69: note: because 'static_cast<_To>(std::declval<_From>())' would be invalid: no matching conversion for static_cast from '(lambda at path/A.ixx:9:40)' to '(lambda at path/A.ixx:9:40)'
   27 | concept convertible_to = is_convertible_v<_From, _To> && requires { static_cast<_To>(std::declval<_From>()); };
      | ^
2 errors generated.
```

Even though the lambda is move constructible. The bug disappears when uncommenting the function clang_bug_fix.


CMakeLists.txt:
```cmake
cmake_minimum_required(VERSION 3.30)
project(test)

set(CMAKE_CXX_STANDARD 23)

add_executable(test main.cpp)

target_sources(test
        PUBLIC
        FILE_SET all_my_modules TYPE CXX_MODULES FILES
        A.ixx
)
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWd9v2zgS_muYl4EFibIt-cEP8g_hgq23QZNd9J4EWhpbvEqkjqQc5-X-9gMpyZGbZC-9XXT3Di2ExqHI4cz3zXzD0ExrfhSISzJbkdnmhrWmlGppyv1jcbOXxdMy8fj5TMKE-AmZ-92TE7qyj5_UsmgrJKH9bB8acpFXbYFAwvUJcyMVCbcv3igmjqj7N36C50YqA50xSC7m-nHWGgkHQuNcCm1Am8L6EyaD_TUXhoRbIHR-wpzQBZDIWgAAUGhaJeCEOZBoPVrL8VF3H41iQh-kqgmNOxgIjbkwcL42NTJ3BkJXEHSO2nESbQhd9I5HmwGNlNDkJHkBecXEMdu3x-zAz3afK8sHqYDQ2MV5BhImLtq34uyW989lR-q2G5Fk2WFceHnTvEnfb_DlJ7x26D_TYTGxJt_y375vjHpPALNLBIOZHrULdqMwiJ_cKVm0Oeo-kq_e01Q2htC0lDXuFT4Smq6xqpgiNK2qU01oGiy8wIuygNB0byNIHSMdEDA5wsQ5uzmKthujIUyYyktgqp5PYcL1k1ZSGiA0TZqm4jkzXApNaPo5lwV6rGnstlIYFMYOb_CElWzQOnFXMWMzzI7vWP7x_rPX9ENfzbzf_PQ8KZh51NPFF5gccllJNSk4OwqpDc81THYbmOweYL1jXzDlFdp1BrXxCm4tDeR7Eia79B3TvALI1H_HvFoWNWtgIt-1dw4NM-VokPjJrRiKndAoITSCLtmwgIOS9YsVYRL2zP83VHseoWmf55b5Pv1perJzsqxXI5pelCCz8uCVJEyCeGr_n9ucRqVsFifgdEgxLowGIQ1oZrg-cOu9VLbWtQaDtaXYRXht14ZLZqtHbkrIfuX4CCTcPCvToI3uMx66JeH6t7XPVdUaslQ4Y4TGFav3BQNmBjAHIV-QMJn6tvhmG1e_QTx12ghwUBxFMQRw7XS4dr72u7gtrR9Zxg0q5nx5Fkprjsy2_3rr35_B5CIiYTKzeWQ5Q_uTC-BCGyYMd9UM8vDMW4cCodGrzLxA5w_h7328vYb9-sAqjc5MBAr_2aK21VSiwo6VReRYyT7crtZ3d9nfbjfbLP30cZclq9suofHcKHjVJuzxOJb9oQ2-7kC0IjQxJdc2ojEag5Us2zONmQ0l2pBw1Wv_VeoQP3kpAnNXkP-JwRrrPSo4tCJ3Q39lCntIXqcM5n1d_jEd9it4v3sBzi1zoT-mb485a7XTyPfhRiMoJI5V98kuruUJs06V29zwfYXWoot5HruYn-XYYtS0pnMVLqL20sSgc98JulyKHBt3dLhyw2EXWgjm9A3scilOqNzszEgSrt8J5jdkK40AT6xqmU1Rexx31e6gCRcOmt7_14C0LelqJLNd3raUh8Y1lIemP78TOocX0VzNeqXNfB9GRj45SqjtJ_PFG5RowwzPs5xp4yKQXVVeCrbAvDqxyr5LHRbjY30Ej7KtCtgjcHFiFS-6XaBmJi-5OPYYaStvVhpGu3UHqG8pKCO_ZXoHPo2uOL-Gx_HNdTYePV0idUzKEd9W-rhC7TrL78Gt7ySvJsj_0okz-v8_cUa_58SpURgusPqrnzh_NLwfDe9Hw_vR8P6Uhke75qHhiML-jYaF9_JabXtCAaaU7bEEUyL0gHDtkvo6hT14KBH27REKrlnTIFMaHksU0Ipc1rUT5aMzc_nT6-ra0-tv7vzEXRt94Npoz5zN17eTNftiC839zGoueN3WWY9ZQWj86_bT_e3HnyH0QkeRnzRK_gNzQ2hsUJtujPiJRju03iU_bbP158_Z_UPy8yb5tAEaXuawosjwjHlrmBNRZwEux4BhmmHqiCbTslW5lftuo-d74btfVh9u16OB9PbDNrvfPgCrqqx-yrrDh4aHv99twTqz-7j55cP23k28Hy3sUtAW-GKMyk2xDItFuGA3uAyiaUDnQRzHN-VyvmD-PAgOURQc5gHNp-HssLC_-HkU45Te8CX16cwP7axZQGMPwyA4zOPDIo-mhR_HZOpjzXjlWdnwpDrecK1bXAah78f-TcX2WOnhCwK1tLMm-_aoydSvHIeXdYabyn2VsB4uUW3Hn612XfBkthmduoYccacSd_Xd3yqYpwbB6YoeEvLdLfCmVdWyNKZxxxmaEpoeuSnbvZfbShyU0cVwyZrUxWtVrw_5tKT_DgAA____e6Zs">