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

            Bug ID: 112436
           Summary: SFINAE-unfriendly error on throwing pointer to
                    incomplete type
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: arthur.j.odwyer at gmail dot com
  Target Milestone: ---

====
template<class T>
concept Throwable = requires { throw T(); };
struct Incomplete;

static_assert(!Throwable<Incomplete*>);
static_assert(!Throwable<int(*)[]>);
====

<source>:2:32: error: invalid use of incomplete type 'struct Incomplete'
    2 | concept Throwable = requires { throw T(); };
      |                                ^~~~~~~~~
<source>:3:8: note: forward declaration of 'struct Incomplete'
    3 | struct Incomplete;
      |        ^~~~~~~~~~
<source>:2:32: error: invalid use of array with unspecified bounds
    2 | concept Throwable = requires { throw T(); };
      |                                ^~~~~~~~~

Instead of a hard error in both cases, we expect the concept to be false and
the static_assert to succeed. Clang and EDG succeed. MSVC succeeds on
`Incomplete*` and incorrectly permits throwing `int(*)[]`.

The terse/multi-purpose "invalid use of..." error message seems to come up a
lot in Bugzilla, but I didn't see any search hits for that message plus the
word "throw".

Bug #98388 is probably related.
  • [Bug c++/112436] New: SFINAE... arthur.j.odwyer at gmail dot com via Gcc-bugs

Reply via email to