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

            Bug ID: 97629
           Summary: Difference of addresses of array elements not a
                    constant expression
           Product: gcc
           Version: 10.2.1
            Status: UNCONFIRMED
          Keywords: rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

GCC rejects this valid code:

struct array
{
  int data[6];

  constexpr int* begin() { return data; }
  constexpr int* end() { return data + 6; }

  constexpr int& operator[](int n) { return data[n]; }
};


constexpr bool
test()
{
  array a{{0, 1, 2, 3, 4, 5}};

  for (auto& i : a)
    if (i != (&i - &a[0]))
      return false;
  return true;
}

static_assert(test(), "");



ce.C:23:19: error: non-constant condition for static assertion
 static_assert(test(), "");
               ~~~~^~
ce.C:23:19:   in 'constexpr' expansion of 'test()'
ce.C:18:18: error: '(((((int*)(& a.array::data)) + 4) - (& a.array::data[0]))
<unknown operator> 4)' is not a constant expression
     if (i != (&i - &a[0]))
              ~~~~^~~~~~~~

Reply via email to