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

            Bug ID: 119497
           Summary: Improve diagnostic for failed assert(expr) in
                    constexpr context
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: enhancement
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: redi at gcc dot gnu.org
  Target Milestone: ---

When an assert fails in a constexpr function we get:

a.cc:5:3: error: call to non-'constexpr' function 'void __assert_fail(const
char*, const char*, unsigned int, const char*)'
    5 |   assert(i);
      |   ^~~~~~
/usr/include/assert.h:67:13: note: 'void __assert_fail(const char*, const
char*, unsigned int, const char*)' declared here
   67 | extern void __assert_fail (const char *__assertion, const char *__file,
      |             ^~~~~~~~~~~~~


As suggested in https://github.com/llvm/llvm-project/pull/130458 it would be
more user-friendly to say that an assertion failed, rather than say why the
function wasn't constexpr. The proposal there is:

test.cpp:5:3: note: assertion failed in consteval context: 'result == 42'

which is done by recognising when the failure is in the expansion of a macro
called 'assert' and when the non-constexpr function that causes the error has a
name like __assert_fail or _wassert

Solaris: __assert_c99
AIX: __assert_c99
macOS: __assert_rtn ?
OpenBSD: __assert and __assert2
FreeBSD: __assert


Another way to word it could be:

note: failed assertion is not a constant expression: '...'

Reply via email to