Bug 95724 - error message could be improved in the cascading error case
Summary: error message could be improved in the cascading error case
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 11.0
: P3 enhancement
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: diagnostic
Depends on:
Blocks:
 
Reported: 2020-06-17 16:45 UTC by Haoxin Tu
Modified: 2022-01-07 02:35 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2022-01-07 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Haoxin Tu 2020-06-17 16:45:08 UTC
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.
Comment 1 Martin Liška 2020-06-17 17:43:41 UTC
For the next time, can you please add 'ice-on-invalid-code' keyword?
Comment 2 Haoxin Tu 2020-06-17 17:54:55 UTC
(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!
Comment 3 Martin Liška 2020-06-17 18:58:18 UTC
(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..
Comment 4 Richard Biener 2020-06-18 08:33:46 UTC
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)
Comment 5 Martin Liška 2020-06-18 08:37:04 UTC
(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..
Comment 6 Jonathan Wakely 2020-06-18 11:37:53 UTC
(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.
Comment 7 Richard Biener 2020-06-18 12:25:17 UTC
(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.
Comment 8 Andrew Pinski 2022-01-07 02:35:09 UTC
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)