| Summary: | misleading error static constexpr member function called in a constant expression before its definition is complete | ||
|---|---|---|---|
| Product: | gcc | Reporter: | Martin Sebor <msebor> |
| Component: | c++ | Assignee: | Not yet assigned to anyone <unassigned> |
| Status: | NEW --- | ||
| Severity: | minor | CC: | egallager, jason, nathan, pokechu022+gccbugzilla, sjames, webrown.cpp |
| Priority: | P3 | Keywords: | diagnostic |
| Version: | 7.0 | ||
| Target Milestone: | --- | ||
| See Also: | https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107186 | ||
| Host: | Target: | ||
| Build: | Known to work: | ||
| Known to fail: | Last reconfirmed: | 2017-08-29 00:00:00 | |
| Bug Depends on: | |||
| Bug Blocks: | 55004 | ||
(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? |
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 () }; ^