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

            Bug ID: 116844
           Summary: (cwg2876) -  Disambiguation of T x = delete("text")
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jakub at gcc dot gnu.org
  Target Milestone: ---

The CWG says that we should decide based on declarator type whether something
starting with { or = is a function definition or variable initializer.
Seems we decide based on function_declarator_p (declarator) instead.

So the DR2144
int f () {};
int a {};
template <typename T>
T b {};
void g () { b<int ()>; }
example is I think ok, on the first line we warn about missing return, i.e. it
is correctly parsed as function definition, the second line is correctly passed
as variable with {} initialization, and we error on trying to define a variable
with function type through template.

But on the
using T = void ();
using U = int;

T a = delete ("hello");
U b = delete ("hello");
we actually choose to parse it as variable initializers in both cases
dr2876.C:4:15: warning: deleting array ‘("hello")’
    4 | T a = delete ("hello");
      |              ~^~~~~~~~
dr2876.C:4:7: error: function ‘void a()’ is initialized like a variable
    4 | T a = delete ("hello");
      |       ^~~~~~~~~~~~~~~~
dr2876.C:5:15: warning: deleting array ‘("hello")’
    5 | U b = delete ("hello");
      |              ~^~~~~~~~
dr2876.C:5:7: error: void value not ignored as it ought to be
    5 | U b = delete ("hello");
      |       ^~~~~~~~~~~~~~~~
and then error on the first because it is variable-like initialization of
function, rather than try to parse it as function definition in the first case
and then complain that it has function type through typedef/using.

Reply via email to