https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90731

            Bug ID: 90731
           Summary: regression - noexcept broken for forward declarations
                    with decltype
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: v at vsamko dot com
  Target Milestone: ---

void foo1() noexcept(true) {}
decltype(foo1) stub_foo1;
void stub_foo1() noexcept(true) {}

This compiles fine with clang 8 and gcc 8.3, but not with gcc 9.1 (all in c++17
mode).

g++ 9.1 produces error
<source>:9:6: error: declaration of 'void stub_foo1() noexcept' has a different
exception specifier

    9 | void stub_foo1() noexcept(true) {}

      |      ^~~~~~~~~

<source>:7:16: note: from previous declaration 'void stub_foo1()'

    7 | decltype(foo1) stub_foo1;

      |                ^~~~~~~~~

Compiler returned: 1

According to the standard
(https://en.cppreference.com/w/cpp/language/noexcept_spec) - Functions
differing only in their exception specification cannot be overloaded (just like
the return type, exception specification is part of function type, but not part
of the function signature) (since C++17).

And indeed, 
void foo1() noexcept(true) {}
void foo2() noexcept(false) {}
std::is_same_v<decltype(foo1), decltype(foo2)> // evaluates to false

Reply via email to