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>;
  • [Bug c++/106596] New: Not a hel... barry.revzin at gmail dot com via Gcc-bugs

Reply via email to