Skip to content
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

ICE when spreading a reference returned by a method #94018

Closed
bikeshedder opened this issue Feb 15, 2022 · 2 comments
Closed

ICE when spreading a reference returned by a method #94018

bikeshedder opened this issue Feb 15, 2022 · 2 comments
Labels
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

@bikeshedder
Copy link

Code

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=18b5d1e136c1560a01287bb5466b0228

struct P {
    x: i64,
}

impl P {
    fn f(&self) -> &P {
        self
    }
}

fn main() {
    let p0 = P { x: 0 };
    let p1 = P { ..p0.f() };
}

Meta

rustc --version --verbose:

rustc 1.58.1 (db9d1b20b 2022-01-20)

When running it with beta or nightly it reports the proper error:

error[[E0308]](https://doc.rust-lang.org/beta/error-index.html#E0308): mismatched types
  [--> src/main.rs:13:20
](https://play.rust-lang.org/?version=beta&mode=debug&edition=2021#)   |
13 |     let p1 = P { ..p0.f() };
   |                    ^^^^^^ expected struct `P`, found `&P`

Error output

error: internal compiler error: compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs:319:25: while adjusting Expr { hir_id: HirId { owner: DefId(0:7 ~ rust_ice_spread_ref[b86a]::main), local_id: 11 }, kind: Path(Resolved(None, Path { span: src/main.rs:13:20: 13:22 (#0), res: Local(HirId { owner: DefId(0:7 ~ rust_ice_spread_ref[b86a]::main), local_id: 7 }), segments: [PathSegment { ident: p0#0, hir_id: Some(HirId { owner: DefId(0:7 ~ rust_ice_spread_ref[b86a]::main), local_id: 10 }), res: Some(Local(HirId { owner: DefId(0:7 ~ rust_ice_spread_ref[b86a]::main), local_id: 7 })), args: None, infer_args: true }] })), span: src/main.rs:13:20: 13:22 (#0) }, can't compose [Borrow(Ref('_#0r, Not)) -> &P] and [Borrow(Ref('_#2r, Not)) -> &P]
Backtrace

thread 'rustc' panicked at 'Box<dyn Any>', compiler/rustc_errors/src/lib.rs:1169:9
stack backtrace:
   0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
   1: std::panic::panic_any::<rustc_errors::ExplicitBug>
   2: <rustc_errors::HandlerInner>::bug
   3: <rustc_errors::Handler>::bug
   4: rustc_middle::ty::context::tls::with_opt::<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, ()>
   5: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>
   6: rustc_middle::util::bug::bug_fmt
   7: <rustc_typeck::check::fn_ctxt::FnCtxt>::apply_adjustments
   8: <rustc_typeck::check::method::confirm::ConfirmContext>::confirm
   9: <rustc_typeck::check::fn_ctxt::FnCtxt>::lookup_method
  10: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_expr_kind
  11: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  12: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_expr_kind
  13: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  14: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_decl_initializer
  15: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_decl_local
  16: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_stmt
  17: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_block_with_expected
  18: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  19: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_return_expr
  20: rustc_typeck::check::check::check_fn
  21: <rustc_infer::infer::InferCtxtBuilder>::enter::<&rustc_middle::ty::context::TypeckResults, <rustc_typeck::check::inherited::InheritedBuilder>::enter<rustc_typeck::check::typeck_with_fallback<rustc_typeck::check::typeck::{closure#0}>::{closure#1}, &rustc_middle::ty::context::TypeckResults>::{closure#0}>
  22: rustc_typeck::check::typeck
  23: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, rustc_span::def_id::LocalDefId, &rustc_middle::ty::context::TypeckResults>
  24: rustc_data_structures::stack::ensure_sufficient_stack::<(&rustc_middle::ty::context::TypeckResults, rustc_query_system::dep_graph::graph::DepNodeIndex), rustc_query_system::query::plumbing::execute_job<rustc_query_impl::plumbing::QueryCtxt, rustc_span::def_id::LocalDefId, &rustc_middle::ty::context::TypeckResults>::{closure#3}>
  25: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::plumbing::QueryCtxt, rustc_query_system::query::caches::DefaultCache<rustc_span::def_id::LocalDefId, &rustc_middle::ty::context::TypeckResults>>
  26: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::typeck
  27: <rustc_middle::hir::map::Map>::par_body_owners::<rustc_typeck::check::typeck_item_bodies::{closure#0}>
  28: rustc_typeck::check::typeck_item_bodies
  29: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, (), ()>
  30: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::plumbing::QueryCtxt, rustc_query_system::query::caches::DefaultCache<(), ()>>
  31: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::typeck_item_bodies
  32: <rustc_session::session::Session>::time::<(), rustc_typeck::check_crate::{closure#7}>
  33: rustc_typeck::check_crate
  34: rustc_interface::passes::analysis
  35: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, (), core::result::Result<(), rustc_errors::ErrorReported>>
  36: rustc_data_structures::stack::ensure_sufficient_stack::<(core::result::Result<(), rustc_errors::ErrorReported>, rustc_query_system::dep_graph::graph::DepNodeIndex), rustc_query_system::query::plumbing::execute_job<rustc_query_impl::plumbing::QueryCtxt, (), core::result::Result<(), rustc_errors::ErrorReported>>::{closure#3}>
  37: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::plumbing::QueryCtxt, rustc_query_system::query::caches::DefaultCache<(), core::result::Result<(), rustc_errors::ErrorReported>>>
  38: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::analysis
  39: <rustc_interface::passes::QueryContext>::enter::<rustc_driver::run_compiler::{closure#1}::{closure#2}::{closure#3}, core::result::Result<(), rustc_errors::ErrorReported>>
  40: <rustc_interface::interface::Compiler>::enter::<rustc_driver::run_compiler::{closure#1}::{closure#2}, core::result::Result<core::option::Option<rustc_interface::queries::Linker>, rustc_errors::ErrorReported>>
  41: rustc_span::with_source_map::<core::result::Result<(), rustc_errors::ErrorReported>, rustc_interface::interface::create_compiler_and_run<core::result::Result<(), rustc_errors::ErrorReported>, rustc_driver::run_compiler::{closure#1}>::{closure#1}>
  42: <scoped_tls::ScopedKey<rustc_span::SessionGlobals>>::set::<rustc_interface::util::setup_callbacks_and_run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<core::result::Result<(), rustc_errors::ErrorReported>, rustc_driver::run_compiler::{closure#1}>::{closure#0}, core::result::Result<(), rustc_errors::ErrorReported>>::{closure#0}::{closure#0}, core::result::Result<(), rustc_errors::ErrorReported>>

My findings

  • The error only exists when calling a method on an object. A normal function returning a `&'static P' doesn't cause this behavior and gives the correct error message.
  • When saving the result in a temporary variable the error isn't triggered either. It only happens when calling the method as part of the spread.

The original code causing this bug used an ArcSwap which I tried to use like that:

pub fn resize(&self, max_size: usize) {
    self.swap_config(PoolConfig {
        max_size,
        ..self.inner.config.load()
    });
}

See: bikeshedder/deadpool@b67b689#diff-3d3a3befe15b287611ab412182035e95cf96ecd0288176897fe353cc87b48767R472

@bikeshedder bikeshedder added 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 Feb 15, 2022
@SNCPlay42
Copy link
Contributor

Looks like #92010.

@bikeshedder
Copy link
Author

Looks like the exact same problem. Since it is no longer existant in the beta or unstable channel I guess it was fixed by #92112 as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
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

No branches or pull requests

2 participants