https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88548
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2018-12-19 CC| |jason at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- The problem I see is that we don't really pass the information that it is a static member function rather than member function through the parser: #1 0x0000000000a2df0e in cp_parser_late_return_type_opt (parser=0x7ffff7ff6ab0, declarator=0x33153f0, requires_clause=@0x7fffffffd378: <tree 0x0>, quals=0) at ../../gcc/cp/parser.c:21466 #2 0x0000000000a2c2a7 in cp_parser_direct_declarator (parser=0x7ffff7ff6ab0, dcl_kind=CP_PARSER_DECLARATOR_NAMED, flags=32, ctor_dtor_or_conv_p=0x7fffffffd5b4, member_p=true, friend_p=false) at ../../gcc/cp/parser.c:20645 #3 0x0000000000a2bf81 in cp_parser_declarator (parser=0x7ffff7ff6ab0, dcl_kind=CP_PARSER_DECLARATOR_NAMED, flags=32, ctor_dtor_or_conv_p=0x7fffffffd5b4, parenthesized_p=0x0, member_p=true, friend_p=false) at ../../gcc/cp/parser.c:20472 #4 0x0000000000a33fe4 in cp_parser_member_declaration (parser=0x7ffff7ff6ab0) at ../../gcc/cp/parser.c:24387 where cp_parser_member_declaration knows this information (decl_specifiers.storage_class == sc_static), but cp_parser_declarator/cp_parser_direct_declarator/cp_parser_late_return_type_opt don't. Similarly for the noexcept: #1 0x0000000000a3510e in cp_parser_noexcept_specification_opt (parser=0x7ffff7ff6ab0, require_constexpr=true, consumed_expr=0x0, return_cond=false) at ../../gcc/cp/parser.c:24961 #2 0x0000000000a352bc in cp_parser_exception_specification_opt (parser=0x7ffff7ff6ab0) at ../../gcc/cp/parser.c:25023 #3 0x0000000000a2c245 in cp_parser_direct_declarator (parser=0x7ffff7ff6ab0, dcl_kind=CP_PARSER_DECLARATOR_NAMED, flags=32, ctor_dtor_or_conv_p=0x7fffffffd5b4, member_p=true, friend_p=false) at ../../gcc/cp/parser.c:20636 #4 0x0000000000a2bf81 in cp_parser_declarator (parser=0x7ffff7ff6ab0, dcl_kind=CP_PARSER_DECLARATOR_NAMED, flags=32, ctor_dtor_or_conv_p=0x7fffffffd5b4, parenthesized_p=0x0, member_p=true, friend_p=false) at ../../gcc/cp/parser.c:20472 #5 0x0000000000a33fe4 in cp_parser_member_declaration (parser=0x7ffff7ff6ab0) at ../../gcc/cp/parser.c:24387 We could say change member_p from bool to enum { NONMEMBER, MEMBER, STATIC_MEMBER }; or similar. But then there is also a problem how to make the diagnostic user friendly. Because, if I just return in the debugger in inject_this_parameter in the third and fourth case, I get: pr88548.C:5:33: error: invalid use of ‘this’ at top level 5 | static auto m3 () -> decltype(this->a) { return 0; } | ^~~~ pr88548.C:5:33: error: invalid use of ‘this’ at top level pr88548.C:6:39: error: invalid use of ‘this’ at top level 6 | static void m4 () noexcept(noexcept(this->a)) { } | ^~~~ errors (for some reason the first one twice), while clang++/icpc talk about this not being available in static member functions. finish_this_expr has nice diagnostics: 2643 tree fn = current_nonlambda_function (); 2644 if (fn && DECL_STATIC_FUNCTION_P (fn)) 2645 error ("%<this%> is unavailable for static member functions"); 2646 else if (fn) 2647 error ("invalid use of %<this%> in non-member function"); 2648 else 2649 error ("invalid use of %<this%> at top level"); but to get the 2645 diagnostics current_function_decl needs to be built and marked as static member, which is something we don't have when parsing the late return type or noexcept.