public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should
@ 2021-03-17 20:46 hanicka at hanicka dot net
  2021-03-17 20:58 ` [Bug c++/99637] " jakub at gcc dot gnu.org
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: hanicka at hanicka dot net @ 2021-03-17 20:46 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 99637
           Summary: bit_cast doesn't work with padding bits and it should
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hanicka at hanicka dot net
  Target Milestone: ---

Standard states in https://eel.is/c++draft/bit.cast#2 "Padding bits of the
result are unspecified."

Current trunk GCC (11.0.1 20210316) gives error in presence of padding bits:

https://compiler-explorer.com/z/MhKMb5

```
struct my_field
{
    // change size to 64 and it will work
    unsigned long long a : 63;
};

constexpr unsigned long long get_value(const auto & val) noexcept {
    static_assert(sizeof(val) == sizeof(unsigned long long));

    return __builtin_bit_cast(unsigned long long, val);
}

constexpr auto f = my_field{0};
constexpr auto v = get_value(f);
```

this is the error message GCC gives, but this shouldn't be a hard error

```
<source>:14:29:   in 'constexpr' expansion of 'get_value<my_field>(f)'
<source>:10:31: error: '__builtin_bit_cast' accessing uninitialized byte at
offset 7
   10 |     return __builtin_bit_cast(unsigned long long, val);
```

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
@ 2021-03-17 20:58 ` jakub at gcc dot gnu.org
  2021-03-17 21:19 ` hanicka at hanicka dot net
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-03-17 20:58 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The result in your case doesn't have any padding bits, but the source has and
some value bits of the result need to be initialized from those padding bits.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
  2021-03-17 20:58 ` [Bug c++/99637] " jakub at gcc dot gnu.org
@ 2021-03-17 21:19 ` hanicka at hanicka dot net
  2021-03-17 21:22 ` jakub at gcc dot gnu.org
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: hanicka at hanicka dot net @ 2021-03-17 21:19 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Hana Dusíková <hanicka at hanicka dot net> ---
I know this is not an argument but MSVC accepts this code, meanwhile I'm asking
Richard what to do about it.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
  2021-03-17 20:58 ` [Bug c++/99637] " jakub at gcc dot gnu.org
  2021-03-17 21:19 ` hanicka at hanicka dot net
@ 2021-03-17 21:22 ` jakub at gcc dot gnu.org
  2021-03-17 21:23 ` redi at gcc dot gnu.org
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-03-17 21:22 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jason at gcc dot gnu.org,
                   |                            |redi at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I'm CCing Jason and Jonathan too.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
                   ` (2 preceding siblings ...)
  2021-03-17 21:22 ` jakub at gcc dot gnu.org
@ 2021-03-17 21:23 ` redi at gcc dot gnu.org
  2021-03-18  9:12 ` redi at gcc dot gnu.org
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2021-03-17 21:23 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
I think the relevant sentence is "Each bit of the value representation of the
result is equal to the corresponding bit in the object representation of from."

For one of the bits in the result, there is no corresponding bit in the object
representation of from. So the result cannot be created.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
                   ` (3 preceding siblings ...)
  2021-03-17 21:23 ` redi at gcc dot gnu.org
@ 2021-03-18  9:12 ` redi at gcc dot gnu.org
  2021-03-18  9:19 ` jakub at gcc dot gnu.org
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2021-03-18  9:12 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #4)
> So the result cannot be created.

Not during constant evaluation, anyway.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
                   ` (4 preceding siblings ...)
  2021-03-18  9:12 ` redi at gcc dot gnu.org
@ 2021-03-18  9:19 ` jakub at gcc dot gnu.org
  2021-03-18 10:35 ` redi at gcc dot gnu.org
  2023-04-26  7:51 ` m.cencora at gmail dot com
  7 siblings, 0 replies; 9+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-03-18  9:19 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #5)
> (In reply to Jonathan Wakely from comment #4)
> > So the result cannot be created.
> 
> Not during constant evaluation, anyway.

And outside of constant evaluation with undefined behavior with the exception
of bit_cast to unsigned char / std::byte?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
                   ` (5 preceding siblings ...)
  2021-03-18  9:19 ` jakub at gcc dot gnu.org
@ 2021-03-18 10:35 ` redi at gcc dot gnu.org
  2023-04-26  7:51 ` m.cencora at gmail dot com
  7 siblings, 0 replies; 9+ messages in thread
From: redi at gcc dot gnu.org @ 2021-03-18 10:35 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Yes. If the result type is a class type and the padding bits in the input
correspond to unsigned char or std::byte subobjects in the result, that's OK
(because the only parts with indeterminate values are byte-like types, the rest
of the result is properly initialized).

I think GCC is correct here.

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug c++/99637] bit_cast doesn't work with padding bits and it should
  2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
                   ` (6 preceding siblings ...)
  2021-03-18 10:35 ` redi at gcc dot gnu.org
@ 2023-04-26  7:51 ` m.cencora at gmail dot com
  7 siblings, 0 replies; 9+ messages in thread
From: m.cencora at gmail dot com @ 2023-04-26  7:51 UTC (permalink / raw)
  To: gcc-bugs

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

m.cencora at gmail dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |m.cencora at gmail dot com

--- Comment #8 from m.cencora at gmail dot com ---
I think that gcc is incorrect here, because the standard says:
"Each bit of the value representation of the result is equal to the
corresponding bit in the object representation of from."

Padding bits are part of object representation, so if padding bits are properly
initialized in source object (which is the case here), the values of padding
bits should become a part of value representation of destination object.

Also when reading the proposal p0476r2 it is clearly stated that bit_cast is
suppose to be typesafe and constexpr-compatible alternative to memcpy (which by
definition copies padding bits as is).

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2023-04-26  7:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-17 20:46 [Bug c++/99637] New: bit_cast doesn't work with padding bits and it should hanicka at hanicka dot net
2021-03-17 20:58 ` [Bug c++/99637] " jakub at gcc dot gnu.org
2021-03-17 21:19 ` hanicka at hanicka dot net
2021-03-17 21:22 ` jakub at gcc dot gnu.org
2021-03-17 21:23 ` redi at gcc dot gnu.org
2021-03-18  9:12 ` redi at gcc dot gnu.org
2021-03-18  9:19 ` jakub at gcc dot gnu.org
2021-03-18 10:35 ` redi at gcc dot gnu.org
2023-04-26  7:51 ` m.cencora at gmail dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).