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

    <tr>
        <th>Summary</th>
        <td>
            [libc++][HIP] `call to 'sqrt' is ambiguous` in lambda functions
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++
      </td>
    </tr>

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

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

<pre>
    Here is the problematic HIP code (i. e. code is heavily affected by `__clang_hip_runtime_wrapper.h`), which compiles with libstdc++, but fails with libc++:

```c++
#include <cmath>

// This works both with libstdc++ and libc++
long double f1(long double arg) {
    return std::sqrt(arg);
}

// This fails with libc++
void f2() {
    auto f3 = [](long double arg) -> long double { return std::sqrt(arg); };
}
```
This code on godbolt: https://godbolt.org/z/jds86rzK9. Note that there it uses clang-17, as hip after that is affected by https://github.com/ROCm/clr/issues/100. But after applying fix for clr the issue is reproducible with newer versions of clang:

```sh
$ clang-19 -x hip test.cpp -S -nogpulib -stdlib=libstdc++
# Ok!

$ clang-19 -x hip test.cpp -S -nogpulib -stdlib=libc++
test.cpp:8:59: error: call to 'sqrt' is ambiguous
    8 |     auto f3 = [](long double arg) -> long double { return std::sqrt(arg); };
      | ^~~~~~~~~
/usr/lib/llvm/19/bin/../../../../lib/clang/19/include/__clang_cuda_math_forward_declares.h:172:19: note: candidate function
  172 | __DEVICE__ double sqrt(double);
      | ^
/usr/lib/llvm/19/bin/../../../../lib/clang/19/include/__clang_hip_cmath.h:250:19: note: candidate function
  250 | __DEF_FUN1(float, sqrt)
      | ^
1 error generated when compiling for gfx906.
```

This affects other functions from `cmath` (sqrt/cbrt/hypot/isinf). Using `sqrtl` works, but this is not a solution for a templated code, and there is no functions like `isinfl`.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vl1v2zYU_TX0y4UFirK-Hvzg2BESbGiLbd2rQJGUxYYmVZKK4z7stw-k7MRpgnUYsAaCFYkf95x7zz0UdU7utRBrlN-gfLegkx-MXW_03p5-NQ9y0Rl-Wt8JK0A68IOA0ZpOiQP1ksHd_SdghgtApJIJiGR-kg4GQR-lOgHte8G84NCdABW4bZmiet8OcmztpL08iPZo6TgKmwyowIjUiGzhOEg2ADOHUSrh4Cj9AEp2znOGyE28ttBNHnoq1cv4ZTDbIByvAs_XZQBvEMmkZmoKmLMtO1A_oOz2PJ00iDTwxyAdHI19cNAZP7wTHajm1_HwRhm9B26mTgnoU0Sq6xfU7hGpAZVhJgCAFX6yGpznAWq2cV-tR6Sa56Es4ix3b0G9zxZvHo3k0BNEqtdx6OQN9BmgbAdzfd9HtkTZLVy_R-XND0FCgHiN9ZJshDcRbZSC0bA3vDPKo2wDg_ejC9tFUueBxIQtm2-INF-4qwr77Zc6gQ_GC_AD9UF0QX0eJiccRP0s0zIogDoY5Ai098LOc6V7pbjv4kk_TF3CzAGR5reP23BjyiLSSOcm4RBpUowTuJn8eU86juok9R56-QS9scCUjU0QF4RoVozW8InJkLZYGS2OwsKjsE4a7cD0M-S3onRDLO_qQqmG5VPk44XzCRtHWP4OS23246RkB0vnuZIdynavOyFqGj4-IJJeFPOftnzZ7zIZZZsKZZu8DqUT1hob_mFUKfAGEClnSZQx64dO7iczubP0KkDlFn6iCGOsGBTlt3-d_-b-mVyocSBKGqUeQ9nTGpGmkxqRJkne_sxz57qdJ59dA5Hm4mFs4rQNBtL2xh6p5S0XTFErXDKgbJOWJPzG5GnjxZw7zSWnXkA_aeal0RF5WpKIvG13t3_eb2_b9pKDM9_56dkcXnH9XzkGn44mGSmRHP9bSiTHz5Satvn8IZhirwz1oXFnWvU7VNJZaLAXWlga2vg4CH0-CmInhsH-qcZF8p3pXHxnNgAHJhjHMyoHvTWHcAbNpl_gcGjNQBrWxdtwGo2PdiB1j0idwGcXYoZm_Wq9CoviwXA5fnyIJ11IBlBwRk0hVMRIwYvDqCKF4ITRrzS_uFlYc4VNyQcRwsTIIU4gt-DrjNdZTRdinZZZlldFjcliWJM6rypa4zIvV30naJdlLGV10aVl1TNWLeSaYLJKCS7TPM8xSVhZdauiKivMGcO8QCssDlSqJGglGPAiOto6TWtcFgtFO6Fc_CYg5MobCAnfCHYdVi27ae_QCivpvHvZx0uv4tfE1bJ8h_Kbu_tPKN_FAvzAQQoMUoOih47TlxwtJqvW_2DoZ9VHaKM1XwTzr5x9Zva4Jn8HAAD___SXvXo">