https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106596
Bug ID: 106596 Summary: Not a helpful diagnostic when putting things out of order in a member function Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: barry.revzin at gmail dot com Target Milestone: --- Consider this example: template <class T> concept C = true; template <class T> struct Widget { void foo() requires C<T> noexcept; }; The issue here is that the noexcept needs to go before the requires clause, but how many people really remember what the order of these things needs to be? The gcc 12.1 error for this is: <source>:5:25: error: expected ';' at end of member declaration 5 | void foo() requires C<T> noexcept; | ^~~~ | ; <source>:5:30: error: expected unqualified-id before 'noexcept' 5 | void foo() requires C<T> noexcept; | ^~~~~~~~ I suspect this might be a difficult thing to provide a diagnostic for, but this particular one is pretty unhelpful. The first one is suggesting I needed to write void foo() requires; which isn't even valid. Hypothetical ideal: <source>:5:30: error: the noexcept-specifier needs to precede the requires-clause 5 | void foo() requires C<T> noexcept; | ^~~~~~~~~~~~~ ^~~~~~~~ | noexcept requires C<T>;