C++ Logo

SG16

Advanced search

Subject: Re: Reinterpreting pointers of character types
From: Tom Honermann (tom_at_[hidden])
Date: 2021-01-29 01:20:43


On 1/28/21 1:57 PM, Jens Maurer via SG16 wrote:
> On 28/01/2021 19.37, Corentin via SG16 wrote:
>>
>> On Thu, Jan 28, 2021 at 7:22 PM Peter Brett <pbrett_at_[hidden] <mailto:pbrett_at_[hidden]>> wrote:
>>
>> I think the big problem here is trying to make it a template.____
>>
>> __ __
>>
>> Make it named.  It’s literally not possible to use this correctly in generic code.
>>
>>
>> Question then is do we want to solve the issue for wchar_t?
>> Because having the name of the encoding in the function kinda precludes that - the sizeof(wchar_t) being platform dependant
> You only get away with char* -> char8_t* because "char" has special
> aliasing exceptions.
>
> You'll get the full set of aliasing concerns for
> wchar_t* -> char16_t* or char32_t*

I think what we're looking for is a portable solution for this ICU hack
<https://github.com/unicode-org/icu/blob/master/icu4c/source/common/unicode/char16ptr.h#L30-L36>
(generalized to make it work for [unsigned] char* conversion to
char8_t*); the goal being to enable some form of explicit restricted
pointer interconvertibility between same sized/aligned types.

I don't understand the ICU hack sufficiently well to relate it to a
memory or object model.  I'm also not sure that it actually works
(though it may suffice for the scenarios that are encountered in practice).

Perhaps something like this would suffice.

    template<typename To, typename From>
    requires requires {
     Â Â Â  requires std::is_trivial_v<To>;
     Â Â Â  requires std::is_trivial_v<From>;
     Â Â Â  requires sizeof(To) == sizeof(From);
     Â Â Â  requires alignof(To) == alignof(From);
    }
    To* alias_barrier_cast(From *p) {
     Â Â Â  asm volatile("" : : "rm"(p) : "memory");
     Â Â Â  return reinterpret_cast<To*>(p);
    }

Tom.



SG16 list run by sg16-owner@lists.isocpp.org