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

            Bug ID: 92505
           Summary: Using mutable in constexpr
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Casey at Carter dot net
  Target Milestone: ---

GCC trunk does not accept this well-formed program in -std=c++2a mode:

    constexpr int f() {
        struct {
            mutable int i = 41;
        } s;
        auto const& cs = s;
        return ++cs.i;
    }

    int main() {
        constexpr int i = f();
        return 42 - i;
    }

Diagnosing (https://godbolt.org/z/n259tb):

    <source>: In function 'int main()':
    <source>:10:24:   in 'constexpr' expansion of 'f()'
    <source>:10:25: error: mutable 'f()::<unnamed struct>::i' is not usable in
a constant expression
       10 |     constexpr int i = f();
          |                         ^
    Compiler returned: 1

AFAICS this is well-formed back to C++14 since it applies lvalue-to-rvalue
conversion to "a non-volatile glvalue of literal type that refers to a
non-volatile object whose lifetime began within the evaluation of e;".

Reply via email to