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

            Bug ID: 63732
           Summary: constexpr is not constant expression, when cast member
                    data pointer to data parent type
           Product: gcc
           Version: 4.9.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pavel.kral at omsquare dot com

The code bellow returns error on 4.9.2 (and cause ICE on 4.8.x) tested on
Linux, MinGW and arm-none-eabi. While 'xxx' compiles just fine, 'yyy' which is
casted to parent type doesn't. Just for clarification static const array
'm_members' compiles fine and generate values at compile time in .rodata
section as expected (arm-none-eabi).

class PropertyBase {};
class Number : PropertyBase {};

class ComplexProperty : PropertyBase {
public:
    Number m_firstNumber;
    static PropertyBase ComplexProperty::* const m_members[];

    // compiles fine
    static constexpr auto xxx = (Number
ComplexProperty::*)&ComplexProperty::m_firstNumber;

    //  error: '(PropertyBase
ComplexProperty::*)&ComplexProperty::m_firstNumber' is not a constant
expression
    static constexpr auto yyy = (PropertyBase
ComplexProperty::*)&ComplexProperty::m_firstNumber;
};

// compiles fine
PropertyBase ComplexProperty::* const ComplexProperty::m_members[] = {
        (PropertyBase ComplexProperty::*) &ComplexProperty::m_firstNumber
};

static ComplexProperty person;

int main() {

}

Reply via email to