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

            Bug ID: 108897
           Summary: Comparing pointer to field in rvalue class is not
                    considered constant expression
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: danakj at orodu dot net
  Target Milestone: ---

This reproduces on godbolt in GCC 10, 11, 12, and trunk.

A pointer to a field of a structure that is constructed as an rvalue temporary
object can not be compared in a constant expression.

```
struct S {
    int i;
    int *p = &i;
    constexpr const int* ptr() const { return &i; }
};

// Not constant expression in GCC.
static_assert(S{2}.ptr() != nullptr);
static_assert(S{2}.p != nullptr);

// Is a constant expression.
static_assert(*S{2}.ptr() == 2);
static_assert(*S{2}.p == 2);

static_assert([]() constexpr {
    S r(2);

    // Is a constant expression.
    return r.ptr() != nullptr && r.p != nullptr;
}());
```

Errors:
<source>:8:26: error: non-constant condition for static assertion
    8 | static_assert(S{2}.ptr() != nullptr);
      |               ~~~~~~~~~~~^~~~~~~~~~
<source>:8:26: error: '((&<anonymous>.S::i) != 0)' is not a constant expression
<source>:9:22: error: non-constant condition for static assertion
    9 | static_assert(S{2}.p != nullptr);
      |               ~~~~~~~^~~~~~~~~~
<source>:9:22: error: '((&<anonymous>.S::i) != 0)' is not a constant expression


- Generates errors for comparing `ptr()` or `p` to nullptr.
- Dereferencing the pointer does not generate an error.
- If the object S is stored as an lvalue, then the pointer comparison is a
constant expression.

Godbolt: https://godbolt.org/z/P9GGKeb3Y

Reply via email to