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.