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

            Bug ID: 95723
           Summary: GCC get confused while parsing a code
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: haoxintu at gmail dot com
  Target Milestone: ---

This code test.cc, GCC might get confused in parsing.

$cat test.cc
template <a> friend foo ( decltype (b=c

$g++-trunk -w test.cc
test.cc:1:12: error: ‘a’ has not been declared
    1 | template  <a>friend foo( decltype (b=c
      |            ^
test.cc:1:14: error: ‘friend’ used outside of class
    1 | template  <a>friend foo( decltype (b=c
      |              ^~~~~~
      |              ------
test.cc:1:36: error: ‘b’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                    ^
test.cc:1:36: error: ‘b’ was not declared in this scope
test.cc:1:38: error: ‘c’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                      ^
test.cc:2: error: expected ‘,’ or ‘...’ at end of input
test.cc:1:39: error: expected ‘)’ at end of input
    1 | template  <a>friend foo( decltype (b=c
      |                        ~              ^
      |                                       )
test.cc:2: error: expected initializer at end of input


$g++-10 -w test.cc
test.cc:1:12: error: ‘a’ has not been declared
    1 | template  <a>friend foo( decltype (b=c
      |            ^
test.cc:1:14: error: ‘friend’ used outside of class
    1 | template  <a>friend foo( decltype (b=c
      |              ^~~~~~
      |              ------
test.cc:1:36: error: ‘b’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                    ^
test.cc:1:36: error: ‘b’ was not declared in this scope
test.cc:1:38: error: ‘c’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                      ^
test.cc:1:36: error: ‘b’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                    ^
test.cc:1:36: error: ‘b’ was not declared in this scope
test.cc:1:38: error: ‘c’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                      ^
test.cc:1:36: error: ‘b’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                    ^
test.cc:1:36: error: ‘b’ was not declared in this scope
test.cc:1:38: error: ‘c’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                      ^
test.cc:1:21: error: ISO C++ forbids declaration of ‘foo’ with no type
[-fpermissive]
    1 | template  <a>friend foo( decltype (b=c
      |                     ^~~
test.cc:1:36: error: ‘b’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                    ^
test.cc:1:36: error: ‘b’ was not declared in this scope
test.cc:1:38: error: ‘c’ was not declared in this scope
    1 | template  <a>friend foo( decltype (b=c
      |                                      ^
test.cc:1:39: error: expected ‘)’ at end of input
    1 | template  <a>friend foo( decltype (b=c
      |                                   ~  ~^
      |                                       )
test.cc:1:26: error: expected primary-expression before ‘decltype’
    1 | template  <a>friend foo( decltype (b=c
      |                          ^~~~~~~~~~~~~
test.cc:1:39: error: expected ‘;’ at end of input
    1 | template  <a>friend foo( decltype (b=c
      |                          ~~~~~~~~~~~~~^
      |                                       ;

I am sure that some error messages in GCC-10 are duplicated. I am also
wondering why GCC-trunk emits "error: expected initializer at end of input",
that's so confusing.

Reply via email to