This code test.cc, GCC-trunk get a bogus error message and then get confused with following code parsing. $cat test.cc template <(union : decltype(a = 0)>) $g++-trunk -w -c test.cc test.cc:1:11: error: expected identifier before ‘(’ token 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:29: error: ‘a’ was not declared in this scope 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:29: error: ‘a’ was not declared in this scope test.cc:1:34: error: expected ‘{’ before ‘)’ token 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:36: error: expected unqualified-id before ‘)’ token 1 | template <(union : decltype(a = 0)>) | ^ $g++-10 -w -c test.cc test.cc:1:11: error: expected identifier before ‘(’ token 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:29: error: ‘a’ was not declared in this scope 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:29: error: ‘a’ was not declared in this scope test.cc:1:35: error: expected ‘{’ before ‘>’ token 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:35: error: expected ‘,’ or ‘...’ before ‘>’ token test.cc:1:36: error: expected ‘>’ at end of input 1 | template <(union : decltype(a = 0)>) | ^ test.cc:1:36: error: expected unqualified-id at end of input I guess GCC-trunk emits the bogus error message "expected ‘{’ before ‘)’ token", and the following error messages are inconsistent with GCC-10. So, GCC-trunk might have something wrong with while parsing this code.
For the next time, can you please add 'ice-on-invalid-code' keyword?
(In reply to Martin Liška from comment #1) > For the next time, can you please add 'ice-on-invalid-code' keyword? I got it. So sorry for my mistake!
(In reply to Haoxin Tu from comment #2) > (In reply to Martin Liška from comment #1) > > For the next time, can you please add 'ice-on-invalid-code' keyword? > > I got it. So sorry for my mistake! It's not a mistake, I just wanted to inform you that it's very unlikely that we'll fix it. We have a lot of these issues..
Note the testcase does not ICE so ice-on-invalid is wrong. It's really a diagnostic only. If we want sth extra to distinguish error diagnostics from warning diagnostics then we should add one (can't come up with a good name right now)
(In reply to Richard Biener from comment #4) > Note the testcase does not ICE so ice-on-invalid is wrong. It's really > a diagnostic only. If we want sth extra to distinguish error diagnostics > from warning diagnostics then we should add one (can't come up with a good > name right now) Yes, I was too eager..
(In reply to Richard Biener from comment #4) > Note the testcase does not ICE so ice-on-invalid is wrong. It's really > a diagnostic only. If we want sth extra to distinguish error diagnostics > from warning diagnostics then we should add one (can't come up with a good > name right now) It's like a weaker form of error-recovery but for cases that don't ICE. cascading-errors maybe.
(In reply to Jonathan Wakely from comment #6) > (In reply to Richard Biener from comment #4) > > Note the testcase does not ICE so ice-on-invalid is wrong. It's really > > a diagnostic only. If we want sth extra to distinguish error diagnostics > > from warning diagnostics then we should add one (can't come up with a good > > name right now) > > It's like a weaker form of error-recovery but for cases that don't ICE. error-recovery is fine then I guess since it doens't imply ICEing. We use the combo of ice-on-invalid-code, error-recovery for that. But indeed the description says 'use only for ice-on-invalid-code' ... > cascading-errors maybe.
I don't like the error messages from any of the other compilers I tried either: clang: <source>:2:29: error: use of undeclared identifier 'a' template <(union : decltype(a = 0)>) ^ <source>:2:36: error: expected '{' after base class list template <(union : decltype(a = 0)>) ^ <source>:2:12: error: '(unnamed union at <source>:2:12)' cannot be defined in a parameter type template <(union : decltype(a = 0)>) ^ <source>:2:37: error: expected template parameter template <(union : decltype(a = 0)>) ^ <source>:2:37: error: expected ',' or '>' in template-parameter-list <source>:2:37: error: expected unqualified-id MSVC: <source>(2): error C2059: syntax error: '(' <source>(2): error C2947: expecting '>' to terminate template-parameter-list, found '>' <source>(2): error C2059: syntax error: ')' <source>(3): fatal error C1004: unexpected end-of-file found ICC: <source>(2): error: expected a type specifier template <(union : decltype(a = 0)>) ^ <source>(2): error: expected a "," or ">" <source>(2): error: expected a declaration <source>(2): error: expected a ";" compilation aborted for <source> (code 2)