https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120204
Bug ID: 120204 Summary: `is not usable as a 'constexpr' function because` and no reason why Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- ``` template<class T, int t> struct array{}; template <typename... TArgs> struct ILEArglist { using Sizes = array<int, sizeof...(TArgs)>; static constexpr auto size() { Sizes &offsets_c = offsets; return 0; } array<char, size()> offsets(); }; auto arglist = ILEArglist<>(); ``` GCC gives: ``` <source>: In instantiation of 'struct ILEArglist<>': <source>:13:29: required from here 13 | auto arglist = ILEArglist<>(); | ^ <source>:11:19: error: 'static constexpr auto ILEArglist<TArgs>::size() [with TArgs = {}]' called in a constant expression 11 | array<char, size()> offsets(); | ~~~~^~ <source>:7:25: note: 'static constexpr auto ILEArglist<TArgs>::size() [with TArgs = {}]' is not usable as a 'constexpr' function because: 7 | static constexpr auto size() { | ^~~~ <source>:11:19: note: in template argument for type 'int' 11 | array<char, size()> offsets(); | ~~~~^~ Compiler returned: 1 ``` While clang gives: ``` <source>:8:24: error: call to non-static member function without an object argument 8 | Sizes &offsets_c = offsets; | ^~~~~~~ <source>:8:12: error: declaration of reference variable 'offsets_c' requires an initializer 8 | Sizes &offsets_c = offsets; | ^~~~~~~~~ <source>:11:15: note: in instantiation of member function 'ILEArglist<>::size' requested here 11 | array<char, size()> offsets(); | ^ <source>:13:16: note: in instantiation of template class 'ILEArglist<>' requested here 13 | auto arglist = ILEArglist<>(); | ^ ```