https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107939
Bug ID: 107939 Summary: Rejects use of `extern const` variable in a template Product: gcc Version: 13.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: johelegp at gmail dot com CC: johelegp at gmail dot com Target Milestone: --- See https://compiler-explorer.com/z/q3a7e7s1e. Changing `#if 1` to `#if 0` works, so this can't be due to > The program is ill-formed, no diagnostic required, if: > (6.4) a hypothetical instantiation of a template immediately following its > definition would be ill-formed due to a construct that does not depend on a > template parameter, or > -- https://eel.is/c++draft/temp.res.general#6.4 And since all compilers accept it as a non-template, nothing in [expr.const] is being violated. ```C++ struct Q { struct P { const Q* p; }; int n; constexpr P operator()(auto) const { return {this}; } }; extern const Q q; #if 1 template<int> constexpr auto p = q(0); static_assert(p<0>.p == &q); #else constexpr auto p = q(0); static_assert(p.p == &q); #endif constexpr Q q = {}; ``` ``` <source>:12:37: error: the value of 'q' is not usable in a constant expression 12 | template<int> constexpr auto p = q(0); | ^ <source>:9:16: note: 'q' was not declared 'constexpr' 9 | extern const Q q; | ^ <source>:13:22: error: non-constant condition for static assertion 13 | static_assert(p<0>.p == &q); | ~~~~~~~^~~~~ Compiler returned: 1 ```