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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Linker failure for std::visit with a templated lambda using a forward declared templated function
        </td>
    </tr>

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

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

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

<pre>
    ```cpp
#include <type_traits>
#include <variant>

using MyType = std::variant<double, int>;

template <typename T>
auto foo(T&& arg) -> std::remove_cvref_t<T>;

auto bar(MyType const& v) {
    auto callable = []<typename Arg>(Arg&& arg) -> MyType {
        return foo(std::forward<Arg>(arg));
    };
    return std::visit(callable, v);
}

template <typename T>
auto foo(T&& arg) -> std::remove_cvref_t<T> {
    return arg;
}

int main() {
 MyType b {5.3};
 bar(b);
}
```
https://godbolt.org/z/n54f19hn5

It seems that only the declarations get generated for `foo`, but no definitions. However, if `foo` is no longer forward declared, everything works: https://godbolt.org/z/c1WY647af.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VF2PqzYQ_TXOy2gjsIGQBx72bm7USq1UqStVfVoZewD3Gjuyh6zSX18Z2Hx0b9W3i1ASwpkz5xzbI2M0vUNsWPmFlYeNnGjwofmdsJPuNzlZpE3r9aVhVbbc6nRi2YFlz4wL45SdNAITL3Q54RsFaSgy8fV7iLMMRjq6vZ0_p2hcD79eXi-nhDpAJM3EMxPPV_yL9lNrkfEXMEu9-HJPQTierKSrDCdHhNdrHzmRh857xutXxivGK5ChZ3wPT0x8vfULOPozvqlzwO4ttX393GrmamVgvF4lK-8iJc5zYmS7FQ4AMIOVtFa2dvG2hHwv8zn0qQuv04_P4j5yuadNV0CagltdXR10PrzLoJl4udIuZOkWdxRsd3h4Xulu0ZtoiPH6Q3yK_nxPkgh-0Ao8ml-VpvL_0GIcwSiNY7x-XJE1yzb9VW7FQwbLkrbft_ix85fHgegUk15-ZPzYe916S1uf_Bz_ZvzoyqLL94Mr70X9TBARxwg0SALv7AVoQNCorAySjHcReiTo0WGQhBo6H4BVWUqtylL-7UTgPGjsjDNzxRZ-8u94xjCfjO4GBxMT1HrXY4B1V6zNUCd0qrrQkI7euw_fkh_4P2Mq_-PPqtjJbrvRjdB7sZcbbPKdyEWR7UW9GZq80FjXVdspXdWIGVYqQ17mperyvMrUxjQ840Werirjeb3tFM9FJUVWaNVWxZ4VGY7S2K215zE135gYJ2zyvNyJfGNlizbOw4pzZaXrGedpboUmFTy1Ux9ZkVkTKd4oyJCdJ9xSUR7gF-O-pWiksVPAOezHzQ_vhgaQ8LGzNVg5tlrCMq_kp1TvkN3kVFqgzRRs869UDQ1Tu1V-ZPyY9K1fT6fg_0JFjB9nv5Hx42r53PB_AgAA___lD68F">