https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114925

--- Comment #2 from fabian_kessler at gmx dot de <fabian_kessler at gmx dot de> 
---
(In reply to Andrew Pinski from comment #1)
> I thought char8_t is still a character type so aliasing wise it falls under
> that rule.

Actually no. They are distinct types and only 4 types are allowed to alias
everything. That's char, signed/unsigned char and std::byte.

Consider the following function:

```
void cringe(char*& a, char8_t*& b){
    b = u8"Hello There!"
    print(a);
}
```

```
int main(){
   char8_t* obiwan = u8"Kenobi"; 
   cringe((char*&)obiwan, obiwan); // Might output "Kenobi" instead of "Hello
There!"   
}
```

That is, because the compiler is allowed to assume, that b can't alias a and no
change can't happen to a in that function.

Reply via email to