The error below is a bit confusing: the definition of B::bar() is complete when it's called. I think I understand that the reason for the error below is actually that the function is called before the definition of the class of which it's a member is complete. The error should make that clear, although it seems that accepting it (e.g., as an extension) would make static constexpr member functions quite a bit more useful. $ cat y.C && gcc -S -Wall -Wextra -Wpedantic y.C struct A { static constexpr int foo () { return 1; } }; struct B: A { static constexpr int bar () { return 2; } enum E { e = B::foo () }; enum F { f = B::bar () }; }; y.C:8:23: error: ‘static constexpr int B::bar()’ called in a constant expression before its definition is complete enum F { f = B::bar () }; ~~~~~~~^~ y.C:8:24: error: enumerator value for ‘f’ is not an integer constant enum F { f = B::bar () }; ^
(In reply to Martin Sebor from comment #0) > The error below is a bit confusing: the definition of B::bar() is complete > when it's called. > > I think I understand that the reason for the error below is actually that > the function is called before the definition of the class of which it's a > member is complete. The error should make that clear, although it seems > that accepting it (e.g., as an extension) would make static constexpr member > functions quite a bit more useful. Confirmed. If accepting it as an extension, sounds like material for -fpermissive.
(In reply to Eric Gallager from comment #1) > (In reply to Martin Sebor from comment #0) > > The error below is a bit confusing: the definition of B::bar() is complete > > when it's called. > > > > I think I understand that the reason for the error below is actually that > > the function is called before the definition of the class of which it's a > > member is complete. The error should make that clear, although it seems > > that accepting it (e.g., as an extension) would make static constexpr member > > functions quite a bit more useful. > > Confirmed. If accepting it as an extension, sounds like material for > -fpermissive. C++ FE maintainers, is this something you'd want to do?