matthew-j-code wrote:

> How does this interact with libc++, and non-Linux targets?

The '' is emitted for both libc++ and libstdc++, but no comparison method for 
libc++ is affected by including ''. Libc++ has 3 implemented methods for 
comparison of typeinfo name, the default for internal-linkage types on ELF is 
pointer only comparison, which differs from libstdc++ strcmp (which is where 
the error stems from).

libcxx/include/typeinfo : (ELF default)
```
_LIBCPP_HIDE_FROM_ABI _LIBCPP_ALWAYS_INLINE static bool __eq(__type_name_t 
__lhs, __type_name_t __rhs) _NOEXCEPT {
    return __lhs == __rhs;
  }
  ```
libcxx/include/typeinfo : (COFF default)
```
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_ALWAYS_INLINE static bool __eq(__type_name_t 
__lhs, __type_name_t __rhs) _NOEXCEPT {
   return __lhs == __rhs || __builtin_strcmp(__lhs, __rhs) == 0;
 }
```

libcxx/include/typeinfo : (Apple)
```
if (__lhs == __rhs)
      return true;
    if (__is_type_name_unique(__lhs) || __is_type_name_unique(__rhs))
      // Either both are unique and have a different address, or one of them
      // is unique and the other one isn't. In both cases they are unequal.
      return false;
    return __builtin_strcmp(__type_name_to_string(__lhs), 
__type_name_to_string(__rhs)) == 0;
   ```
   
   So operator== and dynamic_cast are unaffected everywhere.
   name() changes, libstdc++ strips the prefix, libc++ returns it.
   
libstdc++ : 
```  const char* name() const _GLIBCXX_NOEXCEPT
    { return __name[0] == '*' ? __name + 1 : __name; } ```
    
 libc++ :
 ``` [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI const char* name() const _NOEXCEPT 
{
    return __impl::__type_name_to_string(__type_name);
  } ```

Nothing currently tests this, 


Every Itanium ABI target emits the * for internal linkage types, externally 
visible types are untouched everywhere. The MSVC ABI does not go through this 
code. z/OS additionally need it for both EBCDIC and ASCII encodings.


Happy to send a separate libc++ patch stripping the prefix in name() to match 
libstdc++, let me know what is preferred.

https://github.com/llvm/llvm-project/pull/220864
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to