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

            Bug ID: 95742
           Summary: Bad error message in parsing a function with
                    "decltype()"
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Keywords: diagnostic
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: haoxintu at gmail dot com
                CC: redi at gcc dot gnu.org
  Target Milestone: ---

This code test.cc, I think it's not a garbage input for GCC, but it parses
badly and emits some confusing error messages.

$cat test.cc

int foo( decltype(),int) { } 

$g++-trunk -c -w test.cc
test.cc:1:19: error: expected primary-expression before ‘)’ token
    1 | int foo( decltype(),int)  { }
      |                   ^
test.cc:1:10: error: expected primary-expression before ‘decltype’
    1 | int foo( decltype(),int)  { }
      |          ^~~~~~~~~~
test.cc:1:21: error: expected primary-expression before ‘int’
    1 | int foo( decltype(),int)  { }
      |                     ^~~
test.cc:1:24: error: expression list treated as compound expression in
initializer [-fpermissive]
    1 | int foo( decltype(),int)  { }
      |                        ^

While in Clang
$clang++ -c -w test.cc
test.cc:1:19: error: expected expression
int foo( decltype(),int)  { } 
                  ^
1 error generated.


When I change the code into test1.cc, GCC get following results:

$cat test1.cc
void foo( decltype(),int) { } 

$g++-trunk -c -w test1.cc
test1.cc:1:6: error: variable or field ‘foo’ declared void
    1 | void foo( decltype(),int)  { }
      |      ^~~
test1.cc:1:20: error: expected primary-expression before ‘)’ token
    1 | void foo( decltype(),int)  { }
      |                    ^
test1.cc:1:11: error: expected primary-expression before ‘decltype’
    1 | void foo( decltype(),int)  { }
      |           ^~~~~~~~~~
test1.cc:1:22: error: expected primary-expression before ‘int’
    1 | void foo( decltype(),int)  { }

This time GCC emits "error: variable or field ‘foo’ declared void"?

Also in Clang

$clang++ -c -w test1.cc
test1.cc:1:20: error: expected expression
void foo( decltype(),int)  { } 
                   ^
1 error generated.

I guess GCC might can not recognize the function definition correctly?

Reply via email to