Skip to content

ICE on "Error constructed but not emitted" #63135

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
dwrensha opened this issue Jul 30, 2019 · 5 comments · Fixed by #63202
Closed

ICE on "Error constructed but not emitted" #63135

dwrensha opened this issue Jul 30, 2019 · 5 comments · Fixed by #63202
Labels
A-parser Area: The parsing of Rust source code to an AST C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@dwrensha
Copy link
Contributor

I'm seeing an internal compiler error on the following input (found by fuzz-rustc):

fn i(n{...,f #
error: this file contains an un-closed delimiter
 --> main.rs:2:2
  |
1 | fn i(n{...,f #
  |     - - un-closed delimiter
  |     |
  |     un-closed delimiter
2 | 
  |  ^

error: expected field pattern, found `...`
 --> main.rs:1:8
  |
1 | fn i(n{...,f #
  |        ^^^ help: to omit remaining fields, use one fewer `.`: `..`

error: internal compiler error: the following error was constructed but not emitted

error: expected `}`, found `,`
 --> main.rs:1:11
  |
1 | fn i(n{...,f #
  |        ---^
  |        |  |
  |        |  expected `}`
  |        `..` must be at the end and cannot have a trailing comma

thread 'rustc' panicked at 'explicit panic', src/librustc_errors/diagnostic_builder.rs:390:13
stack backtrace:
   0: std::panicking::default_hook::{{closure}}
   1: std::panicking::default_hook
   2: rustc::util::common::panic_hook
   3: std::panicking::rust_panic_with_hook
   4: std::panicking::begin_panic
   5: <rustc_errors::diagnostic_builder::DiagnosticBuilder as core::ops::drop::Drop>::drop
   6: syntax::parse::parser::Parser::parse_pat_fields
   7: syntax::parse::parser::Parser::parse_pat_with_range_pat
   8: syntax::parse::parser::Parser::parse_fn_args::{{closure}}
   9: syntax::parse::parser::Parser::parse_seq_to_before_tokens
  10: syntax::parse::parser::Parser::parse_fn_args
  11: syntax::parse::parser::Parser::parse_fn_decl
  12: syntax::parse::parser::Parser::parse_item_fn
  13: syntax::parse::parser::Parser::parse_item_implementation
  14: syntax::parse::parser::Parser::parse_item_
  15: syntax::parse::parser::Parser::parse_item
  16: syntax::parse::parser::Parser::parse_mod_items
  17: syntax::parse::parser::Parser::parse_crate_mod
  18: syntax::parse::parse_crate_from_file
  19: rustc_interface::passes::parse::{{closure}}
  20: rustc::util::common::time
  21: rustc_interface::passes::parse
  22: rustc_interface::queries::Query<T>::compute
  23: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::parse
  24: rustc_interface::interface::run_compiler_in_existing_thread_pool
  25: std::thread::local::LocalKey<T>::with
  26: syntax::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
query stack during panic:
end of query stack
error: aborting due to 4 previous errors


error: internal compiler error: unexpected panic

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.38.0-nightly (04b88a9eb 2019-07-29) running on x86_64-apple-darwin

The error happens on stable, beta, and nightly.

@jonas-schievink jonas-schievink added A-parser Area: The parsing of Rust source code to an AST C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jul 30, 2019
@ExpHP
Copy link
Contributor

ExpHP commented Jul 30, 2019

The only early return I see that doesn't emit delayed_error is here:

https://github.com/rust-lang/rust/blob/master/src/libsyntax/parse/parser.rs#L3623

@ExpHP
Copy link
Contributor

ExpHP commented Jul 30, 2019

Applying the most obvious patch, I get the following non-ICE output:

diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index fb5ff7e8f9..665308eda2 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -3620,7 +3620,15 @@ impl<'a> Parser<'a> {
         let mut etc_span = None;
 
         while self.token != token::CloseDelim(token::Brace) {
-            let attrs = self.parse_outer_attributes()?;
+            let attrs = match self.parse_outer_attributes() {
+                Ok(attrs) => attrs,
+                Err(err) => {
+                    if let Some(mut delayed) = delayed_err {
+                        delayed.emit();
+                    }
+                    return Err(err);
+                },
+            };
             let lo = self.token.span;
 
             // check that a comma comes after every field
   Compiling lolr v0.1.0 (/home/lampam/cpp/throwaway/lolr)
error: this file contains an un-closed delimiter
 --> src/main.rs:1:16
  |
1 | fn i(n{...,f #
  |     - -        ^
  |     | |
  |     | un-closed delimiter
  |     un-closed delimiter

error: expected field pattern, found `...`
 --> src/main.rs:1:8
  |
1 | fn i(n{...,f #
  |        ^^^ help: to omit remaining fields, use one fewer `.`: `..`

error: expected `}`, found `,`
 --> src/main.rs:1:11
  |
1 | fn i(n{...,f #
  |        ---^
  |        |  |
  |        |  expected `}`
  |        `..` must be at the end and cannot have a trailing comma

error: expected `[`, found `}`
 --> src/main.rs:1:15
  |
1 | fn i(n{...,f #
  |               ^ expected `[`

error: expected `:`, found `)`
 --> src/main.rs:1:15
  |
1 | fn i(n{...,f #
  |               ^ expected `:`

error: expected one of `->`, `where`, or `{`, found `<eof>`
 --> src/main.rs:1:15
  |
1 | fn i(n{...,f #
  |               ^ expected one of `->`, `where`, or `{` here

error: aborting due to 6 previous errors

error: Could not compile `lolr`.

To learn more, run the command again with --verbose.

The "expected :, found )" bit doesn't seem quite right. 🙂

@estebank
Copy link
Contributor

@ExpHP expected <something>, found <closing delimiter> is an unfortunate side effect of the unmatched delimiter recovery logic not accounting for TokenTrees. Submit a PR with this patch to fix this ICE as fixing the slightly misleading message will require a much larger (unrelated) change.

@ExpHP
Copy link
Contributor

ExpHP commented Aug 1, 2019

I'll toss one up after I finish running the test suite.

One thing: I'm not sure how to annotate the test. It looks like there's four errors that all point to EOF, but whatever I try to write, only one of them gets recognized as referring to that line.

fn i(n{...,f #
//~^ ERROR expected field pattern
//~| ERROR expected `}`, found `,`
//~ ERROR expected `[`, found `}`
//~ ERROR expected `:`, found `)`
//~ ERROR expected one of `->`, `where`, or `{`, found `<eof>`"
//~ ERROR this file contains an un-closed delimiter
unexpected errors (from JSON output): [
    Error {
        line_num: 7,
        kind: Some(
            Error,
        ),
        msg: "7:52: 7:53: expected `[`, found `}`",
    },
    Error {
        line_num: 7,
        kind: Some(
            Error,
        ),
        msg: "7:52: 7:53: expected `:`, found `)`",
    },
    Error {
        line_num: 7,
        kind: Some(
            Error,
        ),
        msg: "7:52: 7:53: expected one of `->`, `where`, or `{`, found `<eof>`",
    },
]

not found errors (from test file): [
    Error {
        line_num: 4,
        kind: Some(
            Error,
        ),
        msg: "expected `[`, found `}`",
    },
    Error {
        line_num: 5,
        kind: Some(
            Error,
        ),
        msg: "expected `:`, found `)`",
    },
    Error {
        line_num: 6,
        kind: Some(
            Error,
        ),
        msg: "expected one of `->`, `where`, or `{`, found `<eof>`",
    },
]

@estebank
Copy link
Contributor

estebank commented Aug 1, 2019

ExpHP added a commit to exphp-forks/rust that referenced this issue Aug 1, 2019
Centril added a commit to Centril/rust that referenced this issue Aug 2, 2019
bors added a commit that referenced this issue Aug 2, 2019
Rollup of 7 pull requests

Successful merges:

 - #62663 (More questionmarks in doctests)
 - #62969 (Changing the structure of `mir::interpret::InterpError`)
 - #63153 (Remove redundant method with const variable resolution)
 - #63189 (Doc improvements)
 - #63198 (Allow trailing comma in macro 2.0 declarations.)
 - #63202 (Fix ICE in #63135)
 - #63203 (Make is_mutable use PlaceRef instead of it's fields)

Failed merges:

r? @ghost
riking added a commit to riking/trophy-case that referenced this issue Aug 7, 2022
Note: I only searched issues up to rust-lang/rust#63135 for appropriate tags.
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-parser Area: The parsing of Rust source code to an AST C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants