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

rustc 1.59.0-nightly (c5ecc1570 2021-12-15): panic when trait bound not satisfied #92010

Closed
Chris00 opened this issue Dec 16, 2021 · 5 comments · Fixed by #92112
Closed

rustc 1.59.0-nightly (c5ecc1570 2021-12-15): panic when trait bound not satisfied #92010

Chris00 opened this issue Dec 16, 2021 · 5 comments · Fixed by #92112
Labels
C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-medium Medium priority regression-from-stable-to-beta Performance or correctness regression from stable to beta. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@Chris00
Copy link

Chris00 commented Dec 16, 2021

Code

The following code:

#[derive(Clone)]
struct P<T> {
    x: T,
    y: f64,
}

impl<T> P<T> {
    fn y(&self, y: f64) -> Self { P{y, .. self.clone() } }
}

triggers a panic in the compiler (see below). All works as expected if I write impl<T: Clone>.

Meta

rustc --version --verbose:

rustc 1.59.0-nightly (c5ecc1570 2021-12-15)
binary: rustc
commit-hash: c5ecc157043ba413568b09292001a4a74b541a4e
commit-date: 2021-12-15
host: x86_64-unknown-linux-gnu
release: 1.59.0-nightly
LLVM version: 13.0.0

Error output

   Compiling p1 v0.1.0 (/tmp/p1)
error[E0601]: `main` function not found in crate `pbm`
  --> src/pbm.rs:2:1
   |
2  | / #[derive(Clone)]
3  | | struct P<T> {
4  | |     x: T,
5  | |     y: f64,
...  |
9  | |     fn y(&self, y: f64) -> Self { P{y, .. self.clone() } }
10 | | }
   | |_^ consider adding a `main` function to `src/pbm.rs`

error: internal compiler error: compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs:321:26: while adjusting Expr { hir_id: HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 7 }, kind: Path(Resolved(None, Path { span: src/pbm.rs:9:43: 9:47 (#0), res: Local(HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 2 }), segments: [PathSegment { ident: self#0, hir_id: Some(HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 6 }), res: Some(Local(HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 2 })), args: None, infer_args: true }] })), span: src/pbm.rs:9:43: 9:47 (#0) }, can't compose [Borrow(Ref('_#0r, Not)) -> &&P<T>] and [Borrow(Ref('_#4r, Not)) -> &&P<T>]

thread 'rustc' panicked at 'Box<dyn Any>', compiler/rustc_errors/src/lib.rs:1169:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

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

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.59.0-nightly (c5ecc1570 2021-12-15) running on x86_64-unknown-linux-gnu

note: compiler flags: -C embed-bitcode=no -C debuginfo=2 -C incremental -C target-cpu=haswell --crate-type bin

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [typeck] type-checking `<impl at src/pbm.rs:8:1: 10:2>::y`
#1 [typeck_item_bodies] type-checking all item bodies
end of query stack
For more information about this error, try `rustc --explain E0601`.
error: could not compile `p1` due to previous error

rust-compilation exited abnormally with code 101 at Fri Dec 17 00:25:13
Backtrace

RUST_BACKTRACE=1 cargo build
   Compiling p1 v0.1.0 (/tmp/p1)
error[E0601]: `main` function not found in crate `pbm`
  --> src/pbm.rs:2:1
   |
2  | / #[derive(Clone)]
3  | | struct P<T> {
4  | |     x: T,
5  | |     y: f64,
...  |
9  | |     fn y(&self, y: f64) -> Self { P{y, .. self.clone() } }
10 | | }
   | |_^ consider adding a `main` function to `src/pbm.rs`

error: internal compiler error: compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs:321:26: while adjusting Expr { hir_id: HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 7 }, kind: Path(Resolved(None, Path { span: src/pbm.rs:9:43: 9:47 (#0), res: Local(HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 2 }), segments: [PathSegment { ident: self#0, hir_id: Some(HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 6 }), res: Some(Local(HirId { owner: DefId(0:5 ~ pbm[38a7]::{impl#0}::y), local_id: 2 })), args: None, infer_args: true }] })), span: src/pbm.rs:9:43: 9:47 (#0) }, can't compose [Borrow(Ref('_#0r, Not)) -> &&P<T>] and [Borrow(Ref('_#4r, Not)) -> &&P<T>]

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_block_with_expected
  15: <rustc_typeck::check::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  16: rustc_typeck::check::check::check_fn
  17: <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}>
  18: rustc_typeck::check::typeck
  19: <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>
  20: 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}>
  21: 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>>
  22: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::typeck
  23: <rustc_middle::hir::map::Map>::par_body_owners::<rustc_typeck::check::typeck_item_bodies::{closure#0}>
  24: rustc_typeck::check::typeck_item_bodies
  25: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, (), ()>
  26: rustc_data_structures::stack::ensure_sufficient_stack::<((), rustc_query_system::dep_graph::graph::DepNodeIndex), rustc_query_system::query::plumbing::execute_job<rustc_query_impl::plumbing::QueryCtxt, (), ()>::{closure#3}>
  27: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::plumbing::QueryCtxt, rustc_query_system::query::caches::DefaultCache<(), ()>>
  28: rustc_query_system::query::plumbing::get_query::<rustc_query_impl::queries::typeck_item_bodies, rustc_query_impl::plumbing::QueryCtxt>
  29: <rustc_session::session::Session>::time::<(), rustc_typeck::check_crate::{closure#7}>
  30: rustc_typeck::check_crate
  31: rustc_interface::passes::analysis
  32: <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>>
  33: 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}>
  34: 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>>>
  35: rustc_query_system::query::plumbing::get_query::<rustc_query_impl::queries::analysis, rustc_query_impl::plumbing::QueryCtxt>
  36: <rustc_interface::passes::QueryContext>::enter::<rustc_driver::run_compiler::{closure#1}::{closure#2}::{closure#3}, core::result::Result<(), rustc_errors::ErrorReported>>
  37: <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>>
  38: 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}>
  39: <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>>
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.59.0-nightly (c5ecc1570 2021-12-15) running on x86_64-unknown-linux-gnu

note: compiler flags: -C embed-bitcode=no -C debuginfo=2 -C incremental -C target-cpu=haswell --crate-type bin

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
#0 [typeck] type-checking `<impl at src/pbm.rs:8:1: 10:2>::y`
#1 [typeck_item_bodies] type-checking all item bodies
#2 [analysis] running analysis passes on this crate
end of query stack
For more information about this error, try `rustc --explain E0601`.
error: could not compile `p1` due to previous error

Compilation exited abnormally with code 101 at Fri Dec 17 00:26:54

@Chris00 Chris00 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 Dec 16, 2021
@SNCPlay42
Copy link
Contributor

SNCPlay42 commented Dec 17, 2021

Output on stable:

error[E0308]: mismatched types
 --> <source>:8:43
  |
8 |     fn y(&self, y: f64) -> Self { P{y, .. self.clone() } }
  |                                           ^^^^^^^^^^^^ expected struct `P`, found `&P<T>`
  |
  = note: expected struct `P<T>`
          found reference `&P<T>`

(An awkward but correct error - without T: Clone, the compiler uses autoref to resolve clone as <&T as Clone>::clone which returns &T.)


searched nightlies: from nightly-2021-10-16 to nightly-2021-11-28
regressed nightly: nightly-2021-11-10
searched commit range: 495322d...8b09ba6
regressed commit: 8b09ba6

bisected with cargo-bisect-rustc v0.6.1

Host triple: x86_64-unknown-linux-gnu
Reproduce with:

cargo bisect-rustc --preserve --start=2021-10-16 --end=2021-11-28 --regress=ice 

@rustbot label regression-from-stable-to-beta

@rustbot rustbot added regression-from-stable-to-beta Performance or correctness regression from stable to beta. I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels Dec 17, 2021
@nbdd0121
Copy link
Contributor

Probably #90035?

@apiraino
Copy link
Contributor

Assigning priority as discussed in the Zulip thread of the Prioritization Working Group.

@rustbot label -I-prioritize +P-medium

@rustbot rustbot added P-medium Medium priority and removed I-prioritize Issue: Indicates that prioritization has been requested for this issue. labels Dec 23, 2021
@compiler-errors
Copy link
Member

compiler-errors commented Dec 24, 2021

I think this is a duplicate of #91502, and I also put up a fix in #91538 (along with both @SparrowLii in #92112 and @Aaron1011 in #92083) which has been waiting for a review for quite some time..

Not sure which one of our PRs should be approved, but at least one of them should :^) -- re: #92112, I agree with Aaron that this is the simpler and more targeted fix for the bug, so I'll just close mine after this gets approved probably.

(edit: made it clearer who I was referring to in the original comment - lol, sorry)

@apiraino
Copy link
Contributor

thanks @compiler-errors for the note! I'll also add (as a self-reminder) that in #92083 Aaron also mentions that #92112 might be a better fix.

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) ❄️ P-medium Medium priority regression-from-stable-to-beta Performance or correctness regression from stable to beta. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
6 participants