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

            Bug ID: 118367
           Summary: Confusing error message with user generated
                    static_assert "expression cannot be used as a
                    function"
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: veeloxfire at gmail dot com
  Target Milestone: ---

The user-generated static assert messages output a confusing error message if
`data` and `size` are not functions

`
  #include <cstddef>

  struct A {
    const char* data;
    std::size_t size;
  };

  static_assert(false, A{});
`

produces the output

`
  <source>:8:26: error: expression cannot be used as a function
      8 | static_assert(false, A{});
        |      
`
https://godbolt.org/z/s8Gsaxa1T

This is because in `cexpr_str::type_check` the code does

`
  message_sz = finish_call_expr (message_sz, &size_args, false, false,
                                complain);
  message_data = finish_call_expr (message_data, &data_args, false, false,
                                   complain);
  if (message_sz == error_mark_node || message_data == error_mark_node)
    return false;
`
https://gcc.gnu.org/git?p=gcc.git;a=blob;f=gcc/cp/semantics.cc;h=15840e10620cfcdc14bd03f5092b22e1864f4c06;hb=HEAD#l12129

Whereas in the other 3/4 cases a custom error messages inserted after something
fails, making the error more comprehensible.

Its not the end of the world but would potentially be a nice fix (it lead me
astray of the actual problem when experimenting)

I would do it myself but I've never contributed to gcc before so thought I
would just leave as a bug report

Reply via email to