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

    <tr>
        <th>Summary</th>
        <td>
            Different mangled name for template specialization for clang and gcc
        </td>
    </tr>

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

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

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

<pre>
    Reproducer:

```
#include <type_traits>

namespace llvm {
    class StringRef {
 public:
        StringRef(const char*);

    };
    template <typename T> class Optional {};
}

namespace n {
struct S {
 template <class T>
    std::enable_if_t<std::is_integral<T>::value, llvm::Optional<T>>
    get(llvm::StringRef) const {
        return {};
    }
};

template <>
llvm::Optional<bool>
S::get<bool>(llvm::StringRef) const;
}

void use() {
 n::S().get<bool>("hello");
}
```

For the specialization `S::get<bool>(llvm::StringRef)`, gcc will mangle it as:

```
_ZNK1n1S3getIbEENSt9enable_ifIXsrSt11is_integralIT_E5valueEN4llvm8OptionalIS4_EEE4typeENS6_9StringRefE
```

and clang will mangle it as:

```
_ZNK1n1S3getIbEENSt9enable_ifIXsr3std11is_integralIT_EE5valueEN4llvm8OptionalIS3_EEE4typeENS4_9StringRefE
```

Also the c++filt can only recognize the name mangled by gcc. And the llvm-cxxfilt can only recognize the name mangled by clang.

So I am not sure if this is bug really or this is by design. But I think clang and gcc are trying to make ABI compatible.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysld-P4jYQx_8a52V0KLGTLDzkgR9BQpW20rEPp74gxxmCe8ZObWd73F9f2UDIbu9WPakRCmRmbH_mOzOBOyc7jViRYkWKTcIHfzK2Wp8Grv-SX4ZF0pj2Un3G3pp2EGgJW5J0Q9L7vUxvn-sjZVILNbQIhK39pceDt1x6R1g9Xab5GV3PBYJSr2cgT6urHQBAKO4c7L2VuvuMx4mzHxolxUgAt2sMJXQujHYexIlbQpeELghbTc8N4eRpM1rDs8dzr7gfiQMbvBBW30h-7700mqsIMlkbfv8wJf1Adt4OwsN-ksT0uOsBL6M4Acf5NmTIlqh5o_AgjwdP2Ho0S3eQ2mNnuSJsHddG-ytXAxK6jopeTXfyMW5yTIee0PkjdiLiAq4qvqlKuCz6wer3Otw1HUV5K_k035Hgh4yNMWqM2F_dAfPh-Rj4Z5V5NbKFwSGh8xD7SEvfdro6Zu_PIpSeUClDKH3TSePu73o_3rfGgj8huB6F5Ep-5yE_IGX6SxmFXekaOiHgb6kUnLnuFIL0wN3HI3j44_m3TGd71qHfNXX9vPeLsZV2X5zd-yybNNHu5VAXsXnq5zzAzO8l2e3zQ13XeRiK-nlfHhYjYf2BAly3YXJ097-TM-fbf7H_FJ5N4fP_CL9UzsT6CUJXhK6OUnkQXIPR6gIWhem0_I4xJL4orum10FxCsWaw1G10BphP4tu3X9kgqjab4uwN7ICfQRsPbrAI8gj-JB1IB83QgUWu1AViz92sF2gxvNNnsBo87IJDf70VJJQmtBS3CN5epO7AGzjzrwjL1Q6EOffcy0bhLGkr1i7YgidYZeU8ZxkrijI5VWXePBVNkTZ5KSgrKWtxPl-IoqFMlBmmiaxoSllaZE_pvKCsnLUNLjJBy4zPszbHjOQpnrlUsyDRzNgukc4NWJX0qSwSxRtULv4dUbpc7cLwFZvEVlHQZugcyVMlnXeP9V56hdVGHo9oUftR0qjvMYhzfwe9m8rge6NMMlhVnbzvY6vSLaHbTvrT0MyEORO6jcN6_frUW_MnCk_oNvI7QrcxhX8CAAD__8TZMiM">