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

    <tr>
        <th>Summary</th>
        <td>
            _xend() declaration in intrin.h may cause function multiversioning error on Windows
        </td>
    </tr>

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

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

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

<pre>
    This is a simplified example to reproduce the issue:
```
#include <immintrin.h>

#pragma clang attribute push(__attribute__((target("avx"))), apply_to=function)
#include <atomic>
#pragma clang attribute pop

int main()
{
    return 0;
}
```

Build the example with:
`clang-cl.exe /c main.cpp /Fomain.obj /nologo /std:c++20`
or
`clang-cl.exe /c main.cpp /Fomain.obj /nologo -D__RTM__`

The result is:
```
In file included from main.cpp:1:
In file included from C:\tools\LLVM-18.1.6\lib\clang\18\include\immintrin.h:603:
C:\tools\LLVM-18.1.6\lib\clang\18\include\rtmintrin.h(36,1): error: attribute 'target' multiversioning cannot be combined with attribute 'always_inline'
   36 | _xend(void)
      | ^
C:\tools\LLVM-18.1.6\lib\clang\18\include\intrin.h(167,6): note: function multiversioning caused by this declaration
  167 | void _xend(void);
      |      ^
1 error generated.
```

I reproduce this with:
```
clang version 18.1.6
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Tools\LLVM-18.1.6\bin
```
and
```
Visual Studio Community 2022
17.10.1
```

The example is artificial, I have the same issue when building skia ( https://github.com/google/skia ) with clang-cl and c++20 enabled.
I'm not absolutely sure if this is really a clang issue but it seems reasonable to me to push attributes before including a header which declares a set of functions which also happen to use standard library functions.
Does the declaration of `_xend()` in intrin.h really necessary if the intrinsics are enabled?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVs-v2jgQ_mvMZQRKHBLCgQOEIj2pvew-dY_IiQcyXceObAce__3K-QG0pT1sn1CeHY_HM9988znCOTprxA1Ldyzdz0Tna2M3zoumrc2sNPK2ea_JATkQ4KhpFZ0IJeCHaFqF4A1YbK2RXYXgawRyrkOWbFm0Z9GWZdH4G6Y8IV2pTiKwpKCmIe0t6UXNkk-jxWTXWnFuBFRK6DMI7y2VnUdoO1cznh-P91fHI-M547kX9oy-H3Nx-WCcM76efgWItlW3ozcs2Z86XXkyOqy8CEt401D1iOjXsZj2OWjSHhpBug9h8rzaDQMAAIu-sxoiluym1f1rmPrnriMle0wnsK_k62do-4DmlVrgBwLjh6o_f1G1bZgdTD8z5bcw00aZswkj5yVLthXjO8Z3_HGqsX_ieL4_Hv96_3I8_pDFe41g0XXKA7lf8eJNw4kUwlgFCSdrmvuZLNnG952vTYuwnhbeGOVYWnz-_PXLPM4X8SJjaaGoZGnR58TSIs5ZWoy7w-iZhNssSu4n_X-f1j988jzJGC_iQIlkC2itsWHwoBHjq4m7K2g65emC1pHRpM9QCa2NhxKhMk1JGmXPgu-3C3UVN3ckrUgj46s75ZIM2KqA4wdqyXh-MSTv1IT-Lyyz9NOfZvyUbpytGC-yMV9tfFADmHruRYKdQwnlDXzQGYmVElb07TmGGWerPswQ_U-pJLsfsxkGU0rxgDicUaMVHuXiNx339p2Wkfup4Z63DGowZgIjTAPlh2omW_jIs2O2nLfV_EpamqubN-5STY1hUUhojEQVbFvj6GPiuPNCKZR76rky1uX9ZV1K0i_jE1q-fP-VXCcU_O07SQYK0zSdJn8DHnE-YrZaxNEi_g1Q70-iFG4G6-lEFQkVlPYNanEZLgMnmvFGgGuNGsogaaHq7l8SwHgOtfdtLwv8wPjhTL7uykVlmjAx5qwwCNZgvB6YP2kTCC3hrmKAWpTqXt43xldNIB-I0hnVeVQ3cJ1FoNNQWnJgUSh1g0nYhzjLzgN5cIhNb-FM7zhcdE3_DDfQo_0clHgydtKjkJuAGoVEC9eaqnpkNPb3J3owp3svuNFCKGegFm2LOhzQOQTnhZbCSlBUWmFvjz1jgnuDrof4qWGCb5ZFU4uE9sgiIA1Td04Za6zQueC2RwNHA0dVqCVOWLLkMJObRK6TtZjhJl7FeRyvebKc1RtMyjTDk0xR5GuRymTNq2WeJVUqljFW6Yw2POLLKIvjOOVRslzk61WK61SUPM0yrCRbRtgIUgulLs3C2POsL8BmncZJMlOiROX6zxLONV7H7wrOw1eK3YQ987I7O7aMFDnvHl48eYWbJxC-g-gZjUbcBvn5tToN4mE0_DP076yzavMbzoYoxn_z1ppvWHnGD33sjvHDkNtlw_8LAAD__0Rr7SM">