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: Generic function traits using borrowing HRTB traits #109738

Closed
ten3roberts opened this issue Mar 29, 2023 · 1 comment
Closed

ICE: Generic function traits using borrowing HRTB traits #109738

ten3roberts opened this issue Mar 29, 2023 · 1 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.

Comments

@ten3roberts
Copy link

Encountered an ICE when working with a Borrow -> Deref -> Execute trait chain for a generic System with dependencies for an ECS with queries using HRTBs.

This file caused the issue: https://github.com/ten3roberts/flax/blob/0fb4c6c92e913b0ef0b30965393e58d48416e114/examples/query/transform.rs

I managed to minimize the example to this:
https://github.com/ten3roberts/rustc_1_68_2_ice

Removing the SystemFn trait for a normal Fn or FnMut does not reproduce the issue.

Code

use core::marker::PhantomData;

struct Component<T>(PhantomData<T>);

struct Wrapper<T>(T);

impl<'a, Q: 'a> AsBorrow<'a> for Q {
    type Borrowed = QueryBorrow<'a, Q>;
}

pub struct QueryData<'a, Q> {
    marker: PhantomData<&'a Q>,
}

struct QueryBorrow<'w, Q> {
    marker: PhantomData<&'w Q>,
}

pub trait AsBorrow<'a> {
    /// The dereference target
    type Borrowed: 'a;
}

/// A callable function with 'self lifetime
/// Is not reproducible with Fn trait
trait SystemFn<'this, Args> {
    // fn execute(&'this mut self, args: Args) -> Ret;
}

pub fn build<Args, Func>(data: Args, func: Func)
where
    Func: for<'this, 'a> SystemFn<'this, Args>,
{
}

impl<'this, Func, A> SystemFn<'this, A> for Func
where
    for<'x> A: AsBorrow<'x>,
    for<'x> Func: Fn(<A as AsBorrow<'x>>::Borrowed),
{
}

fn main() {
    let component: Component<i32> = Component(PhantomData);

    let query = Wrapper(component);

    // Component instead of the actual Wrapper<Component<i32>, i32>>
    let system = build(query, |query: QueryBorrow<Component<i32>>| {});
}

Meta

The bug does not persist using cargo +nighly build

rustc --version --verbose:

rustc 1.68.2 (9eb3afe9e 2023-03-27)
binary: rustc
commit-hash: 9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0
commit-date: 2023-03-27
host: x86_64-unknown-linux-gnu
release: 1.68.2
LLVM version: 15.0.6

Error output

error: internal compiler error: compiler/rustc_infer/src/infer/region_constraints/mod.rs:568:17: cannot relate bound region: ReLateBound(DebruijnIndex(0), BoundRegion { var
: 0, kind: BrNamed(DefId(0:43 ~ ice_bug[bed9]::main::'_), '_) }) <= ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrNamed(DefId(0:40 ~ ice_bug[bed9]::{impl#1}::
'x#1), 'x) })

thread 'rustc' panicked at 'Box<dyn Any>', /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/compiler/rustc_errors/src/lib.rs:987:33
Backtrace

stack backtrace:
   0: std::panicking::begin_panic::<rustc_errors::ExplicitBug>
   1: std::panic::panic_any::<rustc_errors::ExplicitBug>
   2: <rustc_errors::HandlerInner>::span_bug::<rustc_span::span_encoding::Span, &alloc::string::String>
   3: <rustc_errors::Handler>::span_bug::<rustc_span::span_encoding::Span, &alloc::string::String>
   4: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>::{closure#0}
   5: rustc_middle::ty::context::tls::with_opt::<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>::{closure#0}, !>::{closure#0}
   6: rustc_middle::ty::context::tls::with_context_opt::<rustc_middle::ty::context::tls::with_opt<rustc_middle::util::bug::opt_span_bug_fmt<rustc_span::span_encoding::Span>
::{closure#0}, !>::{closure#0}, !>
   7: rustc_middle::util::bug::opt_span_bug_fmt::<rustc_span::span_encoding::Span>
   8: rustc_middle::util::bug::span_bug_fmt::<rustc_span::span_encoding::Span>
   9: <rustc_middle::ty::sty::Region as rustc_middle::ty::relate::Relate>::relate::<rustc_infer::infer::equate::Equate>
  10: rustc_middle::ty::relate::super_relate_tys::<rustc_infer::infer::equate::Equate>
  11: <rustc_infer::infer::equate::Equate as rustc_middle::ty::relate::TypeRelation>::tys
  12: <rustc_infer::infer::InferCtxt>::commit_if_ok::<rustc_infer::infer::InferOk<()>, rustc_middle::ty::error::TypeError, <rustc_infer::infer::at::Trace>::eq<rustc_middle:
:ty::Ty>::{closure#0}>
  13: <rustc_infer::infer::at::At>::eq::<rustc_middle::ty::Ty>
  14: <rustc_infer::infer::InferCtxt>::can_eq::<rustc_middle::ty::Ty>
  15: rustc_trait_selection::traits::error_reporting::suggestions::hint_missing_borrow
  16: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::suggestions::TypeErrCtxtExt>::report_closure_arg_mismatch
  17: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::TypeErrCtxtExt>::report_selection_error
  18: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::InferCtxtPrivExt>::report_fulfillment_error
  19: <rustc_infer::infer::error_reporting::TypeErrCtxt as rustc_trait_selection::traits::error_reporting::TypeErrCtxtExt>::report_fulfillment_errors
  20: <rustc_hir_typeck::fn_ctxt::FnCtxt>::demand_coerce
  21: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_decl
  22: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_block_with_expected
  23: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  24: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_return_expr
  25: rustc_hir_typeck::check::check_fn
  26: rustc_hir_typeck::typeck
  27: <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::Local
DefId, &rustc_middle::ty::typeck_results::TypeckResults>
  28: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::queries::typeck, rustc_query_impl::plumbing::QueryCtxt>
  29: rustc_data_structures::sync::par_for_each_in::<&[rustc_span::def_id::LocalDefId], <rustc_middle::hir::map::Map>::par_body_owners<rustc_hir_typeck::typeck_item_bodies:
:{closure#0}>::{closure#0}>
  30: rustc_hir_typeck::typeck_item_bodies
  31: <rustc_query_system::dep_graph::graph::DepGraph<rustc_middle::dep_graph::dep_node::DepKind>>::with_task::<rustc_middle::ty::context::TyCtxt, (), ()>
  32: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::queries::typeck_item_bodies, rustc_query_impl::plumbing::QueryCtxt>
  33: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::typeck_item_bodies
  34: <rustc_session::session::Session>::time::<(), rustc_hir_analysis::check_crate::{closure#7}>
  35: rustc_hir_analysis::check_crate
  36: rustc_interface::passes::analysis
  37: <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::ErrorGuaranteed>>
  38: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::queries::analysis, rustc_query_impl::plumbing::QueryCtxt>
  39: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::analysis
  40: <rustc_interface::passes::QueryContext>::enter::<rustc_driver::run_compiler::{closure#1}::{closure#2}::{closure#2}, core::result::Result<(), rustc_errors::ErrorGuaran
teed>>
  41: rustc_span::with_source_map::<core::result::Result<(), rustc_errors::ErrorGuaranteed>, rustc_interface::interface::run_compiler<core::result::Result<(), rustc_errors:
:ErrorGuaranteed>, rustc_driver::run_compiler::{closure#1}>::{closure#0}::{closure#0}>
  42: <scoped_tls::ScopedKey<rustc_span::SessionGlobals>>::set::<rustc_interface::interface::run_compiler<core::result::Result<(), rustc_errors::ErrorGuaranteed>, rustc_dri
ver::run_compiler::{closure#1}>::{closure#0}, core::result::Result<(), rustc_errors::ErrorGuaranteed>>
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.68.2 (9eb3afe9e 2023-03-27) running on x86_64-unknown-linux-gnu

note: compiler flags: --crate-type bin -C embed-bitcode=no -C debuginfo=2 -C incremental=[REDACTED]

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

query stack during panic:
#0 [typeck] type-checking `main`
#1 [typeck_item_bodies] type-checking all item bodies
#2 [analysis] running analysis passes on this crate
end of query stack
error: could not compile `ice_bug`

@ten3roberts ten3roberts 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 Mar 29, 2023
@ten3roberts
Copy link
Author

Fixed by #107306

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

1 participant