Skip to content

index out of bounds panic in chalk_ir::SubstFolder::fold_free_var_ty #10046

New issue

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

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

Already on GitHub? Sign in to your account

Closed
str4d opened this issue Aug 26, 2021 · 3 comments · Fixed by #10212
Closed

index out of bounds panic in chalk_ir::SubstFolder::fold_free_var_ty #10046

str4d opened this issue Aug 26, 2021 · 3 comments · Fixed by #10212
Assignees
Labels
A-ty type system / type inference / traits / method resolution Broken Window Bugs / technical debt to be addressed immediately S-actionable Someone could pick this issue up and work on it right now

Comments

@str4d
Copy link

str4d commented Aug 26, 2021

Environment

  • VSCode version: 1.59.1, Windows 10 with repo open in WSL remote.
  • rust-analyzer version: 996300f 2021-08-23 stable

To reproduce

Result

rust-analyzer panics twice: once at position 0,0, and again at a position within a line or so of my cursor. Any time I move my cursor (or I think even move my mouse above the multiexp.rs editor pane), another panic is triggered within a second or so.

Panic output
Panic context:
> 
version: 996300f4a 2021-08-23 stable
request: textDocument/codeAction CodeActionParams {
    text_document: TextDocumentIdentifier {
        uri: Url {
            scheme: "file",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/home/str4d/dev/rust/zkcrypto/bellman/src/multiexp.rs",
            query: None,
            fragment: None,
        },
    },
    range: Range {
        start: Position {
            line: 0,
            character: 0,
        },
        end: Position {
            line: 0,
            character: 0,
        },
    },
    context: CodeActionContext {
        diagnostics: [],
        only: None,
    },
    work_done_progress_params: WorkDoneProgressParams {
        work_done_token: None,
    },
    partial_result_params: PartialResultParams {
        partial_result_token: None,
    },
}

thread '<unnamed>' panicked at 'index out of bounds: the len is 1 but the index is 1', /home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/chalk-ir-0.70.0/src/lib.rs:2752:10
stack backtrace:
   0: rust_begin_unwind
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:515:5
   1: core::panicking::panic_fmt
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:92:14
   2: core::panicking::panic_bounds_check
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:69:5
   3: <&chalk_ir::SubstFolder<I,A> as chalk_ir::fold::Folder<I>>::fold_free_var_ty
   4: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
   5: chalk_ir::fold::boring_impls::<impl chalk_ir::fold::Fold<I> for chalk_ir::GenericArg<I>>::fold_with
   6: <smallvec::SmallVec<A> as core::iter::traits::collect::Extend<<A as smallvec::Array>::Item>>::extend
   7: chalk_ir::fold::boring_impls::<impl chalk_ir::fold::Fold<I> for chalk_ir::Substitution<I>>::fold_with
   8: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
   9: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
  10: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_method_call
  11: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  12: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr
  13: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_method_call
  14: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  15: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  16: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  17: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  18: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  19: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  20: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  21: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  22: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  23: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  24: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  25: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr
  26: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  27: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  28: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  29: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  30: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  31: hir_ty::infer::infer_query
  32: salsa::runtime::Runtime::execute_query_implementation
  33: salsa::derived::slot::Slot<Q,MP>::read_upgrade
  34: salsa::derived::slot::Slot<Q,MP>::read
  35: <salsa::derived::DerivedStorage<Q,MP> as salsa::plumbing::QueryStorageOps<Q>>::try_fetch
  36: <DB as hir_ty::db::HirDatabase>::infer_query
  37: hir_ty::db::infer_wait
  38: hir::Function::diagnostics
  39: hir::Module::diagnostics
  40: ide_diagnostics::diagnostics
  41: ide::Analysis::assists_with_fixes::{{closure}}
  42: std::panicking::try
  43: rust_analyzer::handlers::handle_code_action
  44: rust_analyzer::dispatch::RequestDispatcher::on::{{closure}}::{{closure}}
  45: <F as threadpool::FnBox>::call_box
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Panic context:
> 
version: 996300f4a 2021-08-23 stable
request: rust-analyzer/inlayHints InlayHintsParams {
    text_document: TextDocumentIdentifier {
        uri: Url {
            scheme: "file",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/home/str4d/dev/rust/zkcrypto/bellman/src/multiexp.rs",
            query: None,
            fragment: None,
        },
    },
}

thread '<unnamed>' panicked at 'index out of bounds: the len is 1 but the index is 1', /home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/chalk-ir-0.70.0/src/lib.rs:2752:10
stack backtrace:
   0: rust_begin_unwind
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:515:5
   1: core::panicking::panic_fmt
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:92:14
   2: core::panicking::panic_bounds_check
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:69:5
   3: <&chalk_ir::SubstFolder<I,A> as chalk_ir::fold::Folder<I>>::fold_free_var_ty
   4: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
   5: chalk_ir::fold::boring_impls::<impl chalk_ir::fold::Fold<I> for chalk_ir::GenericArg<I>>::fold_with
   6: <smallvec::SmallVec<A> as core::iter::traits::collect::Extend<<A as smallvec::Array>::Item>>::extend
   7: chalk_ir::fold::boring_impls::<impl chalk_ir::fold::Fold<I> for chalk_ir::Substitution<I>>::fold_with
   8: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
   9: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
  10: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_method_call
  11: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  12: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr
  13: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_method_call
  14: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  15: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  16: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  17: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  18: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  19: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  20: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  21: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  22: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  23: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  24: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  25: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr
  26: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  27: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  28: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  29: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  30: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  31: hir_ty::infer::infer_query
  32: salsa::runtime::Runtime::execute_query_implementation
  33: salsa::derived::slot::Slot<Q,MP>::read_upgrade
  34: salsa::derived::slot::Slot<Q,MP>::read
  35: <salsa::derived::DerivedStorage<Q,MP> as salsa::plumbing::QueryStorageOps<Q>>::try_fetch
  36: <DB as hir_ty::db::HirDatabase>::infer_query
  37: hir_ty::db::infer_wait
  38: hir::semantics::SemanticsImpl::analyze_impl
  39: hir::semantics::SemanticsImpl::scope
  40: ide::inlay_hints::inlay_hints
  41: std::panicking::try
  42: rust_analyzer::handlers::handle_inlay_hints
  43: rust_analyzer::dispatch::RequestDispatcher::on::{{closure}}::{{closure}}
  44: <F as threadpool::FnBox>::call_box
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
Panic context:
> 
version: 996300f4a 2021-08-23 stable
request: textDocument/codeAction CodeActionParams {
    text_document: TextDocumentIdentifier {
        uri: Url {
            scheme: "file",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/home/str4d/dev/rust/zkcrypto/bellman/src/multiexp.rs",
            query: None,
            fragment: None,
        },
    },
    range: Range {
        start: Position {
            line: 15,
            character: 18,
        },
        end: Position {
            line: 15,
            character: 18,
        },
    },
    context: CodeActionContext {
        diagnostics: [],
        only: None,
    },
    work_done_progress_params: WorkDoneProgressParams {
        work_done_token: None,
    },
    partial_result_params: PartialResultParams {
        partial_result_token: None,
    },
}

thread '<unnamed>' panicked at 'index out of bounds: the len is 1 but the index is 1', /home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/chalk-ir-0.70.0/src/lib.rs:2752:10
stack backtrace:
   0: rust_begin_unwind
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/std/src/panicking.rs:515:5
   1: core::panicking::panic_fmt
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:92:14
   2: core::panicking::panic_bounds_check
             at /rustc/a178d0322ce20e33eac124758e837cbd80a6f633/library/core/src/panicking.rs:69:5
   3: <&chalk_ir::SubstFolder<I,A> as chalk_ir::fold::Folder<I>>::fold_free_var_ty
   4: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
   5: chalk_ir::fold::boring_impls::<impl chalk_ir::fold::Fold<I> for chalk_ir::GenericArg<I>>::fold_with
   6: <smallvec::SmallVec<A> as core::iter::traits::collect::Extend<<A as smallvec::Array>::Item>>::extend
   7: chalk_ir::fold::boring_impls::<impl chalk_ir::fold::Fold<I> for chalk_ir::Substitution<I>>::fold_with
   8: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
   9: <chalk_ir::Ty<I> as chalk_ir::fold::SuperFold<I>>::super_fold_with
  10: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_method_call
  11: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  12: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr
  13: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_method_call
  14: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  15: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  16: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  17: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  18: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  19: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  20: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  21: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  22: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  23: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  24: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  25: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr
  26: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  27: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  28: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_block
  29: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_inner
  30: hir_ty::infer::expr::<impl hir_ty::infer::InferenceContext>::infer_expr_coerce
  31: hir_ty::infer::infer_query
  32: salsa::runtime::Runtime::execute_query_implementation
  33: salsa::derived::slot::Slot<Q,MP>::read_upgrade
  34: salsa::derived::slot::Slot<Q,MP>::read
  35: <salsa::derived::DerivedStorage<Q,MP> as salsa::plumbing::QueryStorageOps<Q>>::try_fetch
  36: <DB as hir_ty::db::HirDatabase>::infer_query
  37: hir_ty::db::infer_wait
  38: hir::Function::diagnostics
  39: hir::Module::diagnostics
  40: ide_diagnostics::diagnostics
  41: ide::Analysis::assists_with_fixes::{{closure}}
  42: std::panicking::try
  43: rust_analyzer::handlers::handle_code_action
  44: rust_analyzer::dispatch::RequestDispatcher::on::{{closure}}::{{closure}}
  45: <F as threadpool::FnBox>::call_box
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
@lnicola lnicola added A-ty type system / type inference / traits / method resolution S-actionable Someone could pick this issue up and work on it right now labels Aug 26, 2021
@Halkcyon
Copy link

Halkcyon commented Aug 29, 2021

This looks like the same problem as #5366

I ran into this problem while using rltk::SmallVec<[(usize, f32); 10]>::push; the auto-complete of the method name caused the error to be thrown every time after tying pu.

@lnicola
Copy link
Member

lnicola commented Aug 29, 2021

If you look at the stack trace, this is unrelated to #5366.

Do you have a repro for either of the problems?

@flodiebold
Copy link
Member

flodiebold commented Sep 4, 2021

Minimized it to the following test:

#[test]
fn bitslice_panic() {
    check_no_mismatches(
        r#"
//- minicore: option, deref

pub trait BitView {
    type Store;
}

pub struct Lsb0;

pub struct BitArray<V: BitView> { }

pub struct BitSlice<T> { }

impl<V: BitView> core::ops::Deref for BitArray<V> {
    type Target = BitSlice<V::Store>;
}

impl<T> BitSlice<T> {
    pub fn split_first(&self) -> Option<(T, &Self)> { loop {} }
}

fn multiexp_inner() {
    let exp: &BitArray<Foo>;
    exp.split_first();
}
        "#,
    );
}

@flodiebold flodiebold self-assigned this Sep 4, 2021
flodiebold added a commit to flodiebold/rust-analyzer that referenced this issue Sep 12, 2021
Should fix rust-lang#10090, rust-lang#10046, rust-lang#10179.
This is only a workaround, but the proper fix requires some bigger
refactoring (also related to fixing rust-lang#10058), and this at least prevents
the crash.
@bors bors bot closed this as completed in 80552d4 Sep 12, 2021
@bors bors bot closed this as completed in #10212 Sep 12, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-ty type system / type inference / traits / method resolution Broken Window Bugs / technical debt to be addressed immediately S-actionable Someone could pick this issue up and work on it right now
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants