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

--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> ---
OK, so we get:

struct pthread_mutex {
        short m_short[2];
        int m_int;
        int m_int1[4];
                        void *m_ptr;
        int m_int2[2];
        int m_int3[4];
        short m_short2[2];
        int m_int4[5];
        int m_int5[2];
};

struct M {
pthread_mutex m = { 0x36, 0, (0x80 | 0x1), 1, 1, 1, 1, ((void *) 1LL), 1, 0, 0,
0, -1, 0, 0, 2368, 0, 1, 1, 1, 1, 0, 0 };
};

constexpr M m;

Which gives the unhelpful error:

pt.cc:17:13: error: ‘constexpr M::M()’ called in a constant expression
 constexpr M m;
             ^
pt.cc:13:8: note: ‘constexpr M::M()’ is not usable as a constexpr function
because:
 struct M {
        ^

(I'll report that as a front-end bug).


I think the (void*) 1LL is the problem, you can't do a reinterpret_cast in a
constant expression.

This gives the same error:

struct pthread_mutex {
                        void *m_ptr;
};

struct M {
pthread_mutex m = { ((void *) 1LL) };
};

constexpr M m;

Reply via email to