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

    <tr>
        <th>Summary</th>
        <td>
            Builtin implementation of std::decay leads to "ambiguous" error for wasm32-unknown-emscripte
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    EMSDK v 3.1.50 uses Clang's builtin implementation of std::decay that leads to compilation error for the following example.

Using ```#if 0 && __has_builtin(__decay)``` in ```upstream\emscripten\cache\sysroot\include\c++\v1\__type_traits\decay.h``` fixes the issue.

**Console:**
```
D:\emsdk\3.1.50\upstream\emscripten\emcc D:\1.cpp
D:\1.cpp:33:6: error: call to member function 'TryGet' is ambiguous
   33 |         val.TryGet<int>(kTemp);
      | ~~~~^~~~~~~~~~~
D:\1.cpp:7:4: note: candidate function [with T = int]
 7 |         T TryGet( std::decay_t<T> defval = T() )
      | ^
D:\1.cpp:15:4: note: candidate function [with T = int, U = const int &, $2 = true]
   15 |         T TryGet( U&& defval )
      | ^
1 error generated.
emcc: error: 'D:/emsdk/3.1.50/upstream/bin\clang.exe -target wasm32-unknown-emscripten -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=D:\emsdk\3.1.50\upstream\emscripten\cache\sysroot -DEMSCRIPTEN -Werror=implicit-function-declaration -Xclang -iwithsysroot/include\fakesdl -Xclang -iwithsysroot/include\compat D:\1.cpp -c -o C:\Users\VLADYS~1\AppData\Local\Temp\emscripten_temp_j789lfqa\1_0.o' failed (returned 1) 
```

**1.cpp**
```cpp
#include <memory>
#include <type_traits>

struct Any
{
        template<class T>
        T TryGet( std::decay_t<T> defval = T() ) const&
        {
                return this->TryGet_impl<T>( std::move(defval) );
        }

        template<class T, class U,
                std::enable_if_t< std::is_convertible<U, T>::value, bool > = true
        >
        T TryGet( U&& defval ) const&
        {
                return this->TryGet_impl<T>( std::forward<const U&>(defval) );
        }

private:
        template <class T, class U>
        T TryGet_impl(U&& defval) const&
        {
                return std::forward<U>(defval);
        }
};

int main()
{
        constexpr int kTemp = 10;

        Any val;
        val.TryGet<int>(kTemp);

        return 0;
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVl1z4rgS_TXipcuULcUYHngghty6dWdube2Q_XhyyXYblMiWV5JJeMlv35JsDGTIVmZqKRdgfXSf0-o-am6M2DWISxLfk3g94Z3dK71sxG5vUVZskqvyuNx8_bb-HxyATaNpHEJn0EAqebMjNDGQd0Ja0YCoW4k1NpZboRpQFRhbErYibFViwY9g99yCRF4asAoKVbdC9mtRa6WhUhrsHqFSUqoX0ewAX7kzOiXhmoSr_vvRuBkyC4eHMlFBCITOCJ1Blu25yQZIhM6zzPsmdDHuANGct3etsRp5TeIUa1No0VpsSJwWvNgjiVNzNFopS-JUNIXsSjdWEHrvnjg9RCROs8weW8ys5sIaEqfe4XR_9leJVzSemTCmu2ZDqHtS1Rgl0QXLvw9zI0f_unbTHmb5TOK0PwwSpx9RwLooYNgUTYu2vTLTj7AVY4StZoSt-kNwfwoupTuhGuscNVRdU_hTIjTZ6uN_0BKagDDA61zsOtWZ3jAAMAYkSeH0OXA5HXawVDSWsA2h8-ct1q07EHY_bgTwG9_e3t5IvHkbPzchJ4St7hzQRlnsATelKLnFC6zx_Yuwe9gCYWtwvuP14C25wriFE6f5u3zNHOotYRsosTpw6S1tCZ0TugCH_x14Em9uwo3in8JLU3j0L4VqjHVDfY6nQOgd9TNWd3jmBRDFH1J7HOrjROUf4EdDOe6wQc0tlkPCuny6yhNCE0-VPvQ5SR-GnKQPY07Sh1z4enJyMcVXhMByvUMLL9zUjAZd89yolyY4py4Eldg1SmOArwW2LjwGguogjMiFFPZI2LrEinfSQlBLeaghKFSdiwZ1sJMq5zLgUnAT8IbLoxGGsHXFpcFxOTY8l3jhMzBP8mmcLoXx89JoCIKTBLD1j1bgOxGBYL35-i399b-_bDf_h-D3IZBrJ5yiEDY4ZUNQYiG57rUx-MPHDgLhEuQEhj6c9ajiz2hK-YmVTnO5vRIFCAoIFKT90KNB7TTsty-r9Z_f3py8rdp2zS0ncfpFFVySOPX1e0k1s1i32VMyX8jqL7cyysKpcipRcSGxBELnGm2nGywh8uVzS-AuFbEvnltiOAqZU_6eGRCW1lgrfXQKc2PyUqDHFf7bWN0VFlbNcRhN7k_TC8dKcleyLn2Nge3F5sXPC0df0a4gT7YuvZJw0ccK7F6YgLBN7ydzaTIYvvJZqwMSOu99nbSJXRhM1lfxvUmMptD_fSQ0vcQyuulrJhOVp3d2L0xWqOaA2orcXWGps9CHys8fuOzQDeVKuVBsztI1uvkgrN-L1r8cukrpF65LFwcvst6hX_PZaLZaHHwkv48u3A7vDa49Pjq_5vsDdG8QenzH4zYHJ-D3l3zcNVNz3zqNd8SlTw8IX1vtLyR_lfvzjMJ3hki4WDVH1wJcev5kRzCuH_hdGB-hn_RgUi5ZuWALPsFllISULmKaLCb7ZVmVswjzsgzjcB7l4WzBsAoXZT5jFBOeTMSShpRFNIqi6C6JF9NokYR3dEZnVRTTihbkLsSaCzl118JU6d3EN3DLJA7voonkOUrjO2dKG3zpuztCqWuk9dLtCfJuZ8hdKIWx5mzFCitxef_ZvnlsmQml556L0ou2-aPLdNJpudxb25r-oib0YSfsvsunhXKXs4M0_AStVk9Y-AvDETGEPniifwcAAP__DzaVaw">