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.

Reply via email to