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

            Bug ID: 117700
           Summary: spurious error "non-constant condition" when inside a
                    class member
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rdiez-2006 at rd10 dot de
  Target Milestone: ---

I am getting spurious errors "non-constant condition" and "use of 'this' in a
constant expression" when retrieving the size of a fixed member array, but only
from inside class members. The same expression works fine when outside the
class member.

This is a demo:

#include <cstddef>

// This is like "sizeof(arr) / sizeof(arr[0])", but with fancy C++.
template <typename T, std::size_t N>
constexpr std::size_t ArrayElemCount ( T const (&)[N] ) noexcept
{
  return N;
}

class TestClass
{
public:
  int m_array[ 10 ];

  void test_method ( void ) const;
};

static TestClass test_instance;

// This works when checking from outside the class.
static_assert( ArrayElemCount( test_instance.m_array ) == 10 );

void TestClass::test_method ( void ) const
{
  // The traditional method still works from inside the class.
  static_assert( sizeof( m_array ) / sizeof( m_array[0]) == 10 );

  // But this fails when checking from inside the class.
  static_assert( ArrayElemCount( m_array ) == 10 );

  // The compilation errors with GCC 14.2 are:
  // error: non-constant condition for static assertion
  //        static_assert( ArrayElemCount( m_array ) == 10 );
  //                       ~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
  // error: use of 'this' in a constant expression
}

You can play with it here:
https://godbolt.org/z/bYds71fWW

Reply via email to