public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/99452] New: Inconsistent constinit handling
@ 2021-03-07 15:27 nathan at gcc dot gnu.org
  2021-03-07 15:55 ` [Bug c++/99452] " nathan at gcc dot gnu.org
  2021-03-08 14:22 ` jakub at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: nathan at gcc dot gnu.org @ 2021-03-07 15:27 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 99452
           Summary: Inconsistent constinit handling
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: nathan at gcc dot gnu.org
  Target Milestone: ---

constinit forces static initialization (or error).  Sadly the std doesn't
permit c++98-era address-constant expressions (symbol + addend).  but we do
accept that (probably a bug std=c++20 vs std=gnu++20 makes no difference)

But we do so inconsistently.  Both x & y are initializable in this manner --
and we do emit such an initialization if the constinit is removed, regardless
of optimization level.

But with constinit, the presence of the OR operator causes y's initialization
to be rejected.  Even though it's totally foldable.

constinit long x = reinterpret_cast<long> (&x) + 0;
constinit long y = reinterpret_cast<long> (&y) + (0|0);

gcc-current/bin/g++ -c c.cc -std=c++20         
c.cc:4:16: error: ‘constinit’ variable ‘y’ does not have a constant initializer
    4 | constinit long y = reinterpret_cast<long> (&y) + (0|0);
      |                ^
c.cc:4:20: error: conversion from pointer type ‘long int*’ to arithmetic type
‘long int’ in a constant expression
    4 | constinit long y = reinterpret_cast<long> (&y) + (0|0);

Please note I plan an EWG paper to allow symbol+addend, as that seems a useful
behaviour.

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

* [Bug c++/99452] Inconsistent constinit handling
  2021-03-07 15:27 [Bug c++/99452] New: Inconsistent constinit handling nathan at gcc dot gnu.org
@ 2021-03-07 15:55 ` nathan at gcc dot gnu.org
  2021-03-08 14:22 ` jakub at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: nathan at gcc dot gnu.org @ 2021-03-07 15:55 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Nathan Sidwell <nathan at gcc dot gnu.org> ---
Here's another:

using value_t = unsigned long;
unsigned obj;

constinit value_t failed
  = reinterpret_cast<value_t> (&obj) + (11 << 0);

constinit value_t accepted
  = reinterpret_cast<value_t> (&obj) + (11);

bester:309>gcc-current/bin/g++ -c -std=gnu++20 r.ii

r.ii:5:19: error: ‘constinit’ variable ‘failed’ does not have a constant
initializer
    5 | constinit value_t failed
      |                   ^~~~~~
r.ii:6:5: error: conversion from pointer type ‘unsigned int*’ to arithmetic
type ‘value_t’ {aka ‘long unsigned int’} in a constant expression
    6 |   = reinterpret_cast<value_t> (&obj) + (11 << 0);

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

* [Bug c++/99452] Inconsistent constinit handling
  2021-03-07 15:27 [Bug c++/99452] New: Inconsistent constinit handling nathan at gcc dot gnu.org
  2021-03-07 15:55 ` [Bug c++/99452] " nathan at gcc dot gnu.org
@ 2021-03-08 14:22 ` jakub at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-03-08 14:22 UTC (permalink / raw)
  To: gcc-bugs

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

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

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

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Wouldn't https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99456#c10 help to reject
it reliably?

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

end of thread, other threads:[~2021-03-08 14:22 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-07 15:27 [Bug c++/99452] New: Inconsistent constinit handling nathan at gcc dot gnu.org
2021-03-07 15:55 ` [Bug c++/99452] " nathan at gcc dot gnu.org
2021-03-08 14:22 ` jakub at gcc dot gnu.org

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).