Skip to content

Internal compiler error when lifetime bound is unsatisfied for generic associated type defined with impl trait.  #88595

Closed

Description

@LlewVallis

When implementing generic associated type using impl Trait, the compiler panics if the trait lifetime bound is not satisfied by duplicating the where clause.

UPDATE: seems like the compiler also panics if an appropriate where clause is included in the implementation.

Reproducible in a new cargo project on the latest nightly.

Code

#![feature(generic_associated_types)]    
#![feature(type_alias_impl_trait)]    
    
fn main() {    
    println!("Hello, world!");    
}    
    
trait A<'a> {    
    type B<'b>: Clone    
    where    
        'a: 'b;    
                                         
    fn a(&'a self) -> Self::B<'a>;       
}    
    
struct C;    
    
impl<'a> A<'a> for C {    
    type B<'b> = impl Clone;               
        
    fn a(&'a self) -> Self::B<'a> {}       
}   

Meta

rustc --version --verbose:

rustc 1.56.0-nightly (50171c310 2021-09-01)
binary: rustc
commit-hash: 50171c310cd15e1b2d3723766ce64e2e4d6696fc
commit-date: 2021-09-01
host: x86_64-unknown-linux-gnu
release: 1.56.0-nightly
LLVM version: 13.0.0

Error output

error[E0478]: lifetime bound not satisfied
  --> src/main.rs:19:5
   |
19 |     type B<'b> = impl Clone;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^
   |
note: lifetime parameter instantiated with the lifetime `'a` as defined on the impl at 18:6
  --> src/main.rs:18:6
   |
18 | impl<'a> A<'a> for C {
   |      ^^
note: but lifetime parameter must outlive the lifetime `'b` as defined on the associated item at 19:12
  --> src/main.rs:19:12
   |
19 |     type B<'b> = impl Clone;
   |            ^^

thread 'rustc' panicked at 'assertion failed: self.is_free_or_static(r_a) && self.is_free_or_static(r_b)', compiler/rustc_infer/src/infer/free_regions.rs:77:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

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/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.56.0-nightly (50171c310 2021-09-01) running on x86_64-unknown-linux-gnu

note: compiler flags: -C embed-bitcode=no -C debuginfo=2 -C incremental --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/main.rs:18:1: 22:2>::a`
#1 [type_of] computing type of `<impl at src/main.rs:18:1: 22:2>::B::{opaque#0}`
end of query stack
Backtrace

error[E0478]: lifetime bound not satisfied
  --> src/main.rs:19:5
   |
19 |     type B<'b> = impl Clone;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^
   |
note: lifetime parameter instantiated with the lifetime `'a` as defined on the impl at 18:6
  --> src/main.rs:18:6
   |
18 | impl<'a> A<'a> for C {
   |      ^^
note: but lifetime parameter must outlive the lifetime `'b` as defined on the associated item at 19:12
  --> src/main.rs:19:12
   |
19 |     type B<'b> = impl Clone;
   |            ^^

thread 'rustc' panicked at 'assertion failed: self.is_free_or_static(r_a) && self.is_free_or_static(r_b)', compiler/rustc_infer/src/infer/free_regions.rs:77:9
stack backtrace:
   0: rust_begin_unwind
             at /rustc/50171c310cd15e1b2d3723766ce64e2e4d6696fc/library/std/src/panicking.rs:517:5
   1: core::panicking::panic_fmt
             at /rustc/50171c310cd15e1b2d3723766ce64e2e4d6696fc/library/core/src/panicking.rs:101:14
   2: core::panicking::panic
             at /rustc/50171c310cd15e1b2d3723766ce64e2e4d6696fc/library/core/src/panicking.rs:50:5
   3: <rustc_infer::infer::free_regions::FreeRegionMap as rustc_infer::infer::free_regions::FreeRegionRelations>::sub_free_regions
   4: <rustc_infer::infer::InferCtxt as rustc_trait_selection::opaque_types::InferCtxtExt>::constrain_opaque_types
   5: rustc_typeck::check::regionck::RegionCtxt::visit_fn_body
   6: rustc_typeck::check::regionck::<impl rustc_typeck::check::fn_ctxt::FnCtxt>::regionck_fn
   7: rustc_infer::infer::InferCtxtBuilder::enter
   8: rustc_typeck::check::typeck
   9: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  10: rustc_data_structures::stack::ensure_sufficient_stack
  11: rustc_query_system::query::plumbing::force_query_with_job
  12: rustc_query_system::query::plumbing::get_query_impl
  13: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::typeck
  14: rustc_typeck::collect::type_of::find_opaque_ty_constraints::ConstraintLocator::check
  15: <rustc_typeck::collect::type_of::find_opaque_ty_constraints::ConstraintLocator as rustc_hir::intravisit::Visitor>::visit_impl_item
  16: rustc_hir::intravisit::Visitor::visit_nested_impl_item
  17: rustc_hir::intravisit::walk_impl_item_ref
  18: rustc_hir::intravisit::walk_item
  19: rustc_typeck::collect::type_of::type_of
  20: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  21: rustc_data_structures::stack::ensure_sufficient_stack
  22: rustc_query_system::query::plumbing::force_query_with_job
  23: rustc_query_system::query::plumbing::get_query_impl
  24: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::type_of
  25: rustc_typeck::check::check::check_item_type
  26: rustc_middle::hir::map::Map::visit_item_likes_in_module
  27: rustc_typeck::check::check::check_mod_item_types
  28: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  29: rustc_data_structures::stack::ensure_sufficient_stack
  30: rustc_query_system::query::plumbing::force_query_with_job
  31: rustc_query_system::query::plumbing::get_query_impl
  32: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::check_mod_item_types
  33: rustc_session::utils::<impl rustc_session::session::Session>::time
  34: rustc_typeck::check_crate
  35: rustc_interface::passes::analysis
  36: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  37: rustc_data_structures::stack::ensure_sufficient_stack
  38: rustc_query_system::query::plumbing::force_query_with_job
  39: rustc_query_system::query::plumbing::get_query_impl
  40: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::analysis
  41: rustc_interface::passes::QueryContext::enter
  42: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::enter
  43: rustc_span::with_source_map
  44: scoped_tls::ScopedKey<T>::set
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.56.0-nightly (50171c310 2021-09-01) running on x86_64-unknown-linux-gnu

note: compiler flags: -C embed-bitcode=no -C debuginfo=2 -C incremental --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/main.rs:18:1: 22:2>::a`
#1 [type_of] computing type of `<impl at src/main.rs:18:1: 22:2>::B::{opaque#0}`
#2 [check_mod_item_types] checking item types in top-level module
#3 [analysis] running analysis passes on this crate
end of query stack
For more information about this error, try `rustc --explain E0478`.
error: could not compile `mre` due to previous error

Activity

  1. added
    C-bugCategory: This is a bug.
    I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
    T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.
    on Sep 2, 2021
  2. added a commit that references this issue on Sep 5, 2021
  3. Luro02 commented on Sep 20, 2021

    @Luro02
    Contributor

    I ran into this issue just now, reproducible code:

    use core::iter;
    
    pub trait ToIter<T> {
        type Iter<'b>: Iterator<Item = &'b T>
        where
            T: 'b;
    
        fn iter(&self) -> Self::Iter<'_>;
    }
    
    pub struct DrainRange<'a, T>(&'a T);
    
    impl<'a, T> ToIter<T> for DrainRange<'a, T> {
        type Iter<'b>
        where
            T: 'b,
        = iter::FromFn<impl FnMut() -> Option<&'b T>>;
    
        fn iter(&self) -> Self::Iter<'_> {
            unimplemented!()
        }
    }
    
    fn main() {}

    (note: this crashes on stable as well)

    full backtrace
       Compiling playground v0.0.1 (/playground)
    error[E0658]: generic associated types are unstable
     --> src/main.rs:4:5
      |
    4 | /     type Iter<'b>: Iterator<Item = &'b T>
    5 | |     where
    6 | |         T: 'b;
      | |______________^
      |
      = note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
    
    error[E0658]: where clauses on associated types are unstable
     --> src/main.rs:4:5
      |
    4 | /     type Iter<'b>: Iterator<Item = &'b T>
    5 | |     where
    6 | |         T: 'b;
      | |______________^
      |
      = note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
    
    error[E0658]: `impl Trait` in type aliases is unstable
      --> src/main.rs:17:20
       |
    17 |     = iter::FromFn<impl FnMut() -> Option<&'b T>>;
       |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = note: see issue #63063 <https://github.com/rust-lang/rust/issues/63063> for more information
    
    error[E0658]: generic associated types are unstable
      --> src/main.rs:14:5
       |
    14 | /     type Iter<'b>
    15 | |     where
    16 | |         T: 'b,
    17 | |     = iter::FromFn<impl FnMut() -> Option<&'b T>>;
       | |__________________________________________________^
       |
       = note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
    
    error[E0658]: where clauses on associated types are unstable
      --> src/main.rs:14:5
       |
    14 | /     type Iter<'b>
    15 | |     where
    16 | |         T: 'b,
    17 | |     = iter::FromFn<impl FnMut() -> Option<&'b T>>;
       | |__________________________________________________^
       |
       = note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
    
    thread 'rustc' panicked at 'assertion failed: self.is_free_or_static(r_a) && self.is_free_or_static(r_b)', compiler/rustc_infer/src/infer/free_regions.rs:77:9
    stack backtrace:
       0: rust_begin_unwind
                 at /rustc/c8dfcfe046a7680554bf4eb612bad840e7631c4b/library/std/src/panicking.rs:515:5
       1: core::panicking::panic_fmt
                 at /rustc/c8dfcfe046a7680554bf4eb612bad840e7631c4b/library/core/src/panicking.rs:92:14
       2: core::panicking::panic
                 at /rustc/c8dfcfe046a7680554bf4eb612bad840e7631c4b/library/core/src/panicking.rs:50:5
       3: <rustc_infer::infer::free_regions::FreeRegionMap as rustc_infer::infer::free_regions::FreeRegionRelations>::sub_free_regions
       4: <rustc_infer::infer::InferCtxt as rustc_trait_selection::opaque_types::InferCtxtExt>::constrain_opaque_types
       5: rustc_typeck::check::regionck::RegionCtxt::visit_fn_body
       6: rustc_typeck::check::regionck::<impl rustc_typeck::check::fn_ctxt::FnCtxt>::regionck_fn
       7: rustc_infer::infer::InferCtxtBuilder::enter
       8: rustc_typeck::check::typeck
       9: rustc_query_system::query::plumbing::get_query_impl
      10: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::typeck
      11: rustc_typeck::collect::type_of::find_opaque_ty_constraints::ConstraintLocator::check
      12: <rustc_typeck::collect::type_of::find_opaque_ty_constraints::ConstraintLocator as rustc_hir::intravisit::Visitor>::visit_impl_item
      13: rustc_hir::intravisit::Visitor::visit_nested_impl_item
      14: rustc_hir::intravisit::walk_impl_item_ref
      15: rustc_hir::intravisit::walk_item
      16: rustc_typeck::collect::type_of::type_of
      17: rustc_query_system::query::plumbing::get_query_impl
      18: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::type_of
      19: rustc_typeck::check::check::check_item_type
      20: rustc_middle::hir::map::Map::visit_item_likes_in_module
      21: rustc_typeck::check::check::check_mod_item_types
      22: rustc_query_system::query::plumbing::get_query_impl
      23: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::check_mod_item_types
      24: rustc_session::utils::<impl rustc_session::session::Session>::time
      25: rustc_typeck::check_crate
      26: rustc_interface::passes::analysis
      27: rustc_query_system::query::plumbing::get_query_impl
      28: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::analysis
      29: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::enter
      30: rustc_span::with_source_map
      31: rustc_interface::interface::create_compiler_and_run
      32: scoped_tls::ScopedKey<T>::set
    note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
    
    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/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md
    
    note: rustc 1.55.0 (c8dfcfe04 2021-09-06) running on x86_64-unknown-linux-gnu
    
    note: compiler flags: -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2 --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/main.rs:13:1: 22:2>::iter`
    #1 [type_of] computing type of `<impl at src/main.rs:13:1: 22:2>::Iter::{opaque#0}`
    #2 [check_mod_item_types] checking item types in top-level module
    #3 [analysis] running analysis passes on this crate
    end of query stack
    For more information about this error, try `rustc --explain E0658`.
    error: could not compile `playground` due to 5 previous errors
    
  4. Luro02 commented on Sep 20, 2021

    @Luro02
    Contributor
    Regression in `nightly-2021-07-17`
    searched toolchains nightly-2021-07-12 through nightly-2021-08-10
    
    
    ********************************************************************************
    Regression in nightly-2021-07-17
    ********************************************************************************
    
    fetching https://static.rust-lang.org/dist/2021-07-16/channel-rust-nightly-git-commit-hash.txt
    nightly manifest 2021-07-16: 40 B / 40 B [==========================================================================================================================] 100.00 % 1.18 MB/s converted 2021-07-16 to b1f8e27b74c541d3d555149c8efa4bfe9385cd56
    fetching https://static.rust-lang.org/dist/2021-07-17/channel-rust-nightly-git-commit-hash.txt
    nightly manifest 2021-07-17: 40 B / 40 B [========================================================================================================================] 100.00 % 590.29 KB/s converted 2021-07-17 to 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    looking for regression commit between 2021-07-16 and 2021-07-17
    refreshing repository at "rust.git"
    opening existing repository at "rust.git"
    fetching (via local git) commits from b1f8e27b74c541d3d555149c8efa4bfe9385cd56 to 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    refreshing repository at "rust.git"
    opening existing repository at "rust.git"
    looking up first commit
    looking up second commit
    checking that commits are by bors and thus have ci artifacts...
    finding bors merge commits
    found 8 bors merge commits in the specified range
      commit[0] 2021-07-15UTC: Auto merge of #83319 - tmiasko:packed-aligned, r=jackh726
      commit[1] 2021-07-16UTC: Auto merge of #86993 - jackh726:project-gat-binders, r=nikomatsakis
      commit[2] 2021-07-16UTC: Auto merge of #87177 - ehuss:update-cargo, r=ehuss
      commit[3] 2021-07-16UTC: Auto merge of #86662 - mockersf:fix-86620-link-unknown-location, r=jyn514
      commit[4] 2021-07-16UTC: Auto merge of #87182 - GuillaumeGomez:rollup-whwohua, r=GuillaumeGomez
      commit[5] 2021-07-16UTC: Auto merge of #87140 - camsteffen:pat-slice-refs, r=oli-obk
      commit[6] 2021-07-16UTC: Auto merge of #84623 - jackh726:gats-incomplete, r=nikomatsakis
      commit[7] 2021-07-16UTC: Auto merge of #87201 - GuillaumeGomez:rollup-4loi2q9, r=GuillaumeGomez
    validated commits found, specifying toolchains
    
    installing b1f8e27b74c541d3d555149c8efa4bfe9385cd56
    cargo for x86_64-unknown-linux-gnu: 6.06 MB / 6.06 MB [===========================================================================================================] 100.00 % 656.74 KB/s testing...
    RESULT: b1f8e27b74c541d3d555149c8efa4bfe9385cd56, ===> No
    uninstalling b1f8e27b74c541d3d555149c8efa4bfe9385cd56
    
    installing 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    cargo for x86_64-unknown-linux-gnu: 6.07 MB / 6.07 MB [===========================================================================================================] 100.00 % 674.10 KB/s testing...
    RESULT: 74ef0c3e404cc72c08b2d1e14506f90d9e877269, ===> Yes
    uninstalling 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    
    installing a6470c7fa8a511cfbcf9e9d3e1ab6779ac661edb
    cargo for x86_64-unknown-linux-gnu: 6.07 MB / 6.07 MB [===========================================================================================================] 100.00 % 797.24 KB/s testing...
    RESULT: a6470c7fa8a511cfbcf9e9d3e1ab6779ac661edb, ===> No
    uninstalling a6470c7fa8a511cfbcf9e9d3e1ab6779ac661edb
    
    installing 2119976c492894b72287f08865c71d63cff8d471
    cargo for x86_64-unknown-linux-gnu: 6.07 MB / 6.07 MB [===========================================================================================================] 100.00 % 674.55 KB/s testing...
    RESULT: 2119976c492894b72287f08865c71d63cff8d471, ===> No
    uninstalling 2119976c492894b72287f08865c71d63cff8d471
    
    installing c49895d9049f67e07e297ee487836a587f69690e
    cargo for x86_64-unknown-linux-gnu: 6.07 MB / 6.07 MB [===========================================================================================================] 100.00 % 692.50 KB/s testing...
    RESULT: c49895d9049f67e07e297ee487836a587f69690e, ===> No
    uninstalling c49895d9049f67e07e297ee487836a587f69690e
    
    searched toolchains b1f8e27b74c541d3d555149c8efa4bfe9385cd56 through 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    installing 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    cargo for x86_64-unknown-linux-gnu: 6.07 MB / 6.07 MB [==========================================================================================================] 100.00 % 1003.23 KB/s testing...
    uninstalling 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    
    ********************************************************************************
    Regression in 74ef0c3e404cc72c08b2d1e14506f90d9e877269
    ********************************************************************************
    
    ==================================================================================
    = Please file this regression report on the rust-lang/rust GitHub repository     =
    =        New issue: https://github.com/rust-lang/rust/issues/new                 =
    =     Known issues: https://github.com/rust-lang/rust/issues                     =
    = Copy and paste the text below into the issue report thread.  Thanks!           =
    ==================================================================================
    
    searched nightlies: from nightly-2021-07-12 to nightly-2021-08-10
    regressed nightly: nightly-2021-07-17
    searched commit range: https://github.com/rust-lang/rust/compare/b1f8e27b74c541d3d555149c8efa4bfe9385cd56...74ef0c3e404cc72c08b2d1e14506f90d9e877269
    regressed commit: https://github.com/rust-lang/rust/commit/74ef0c3e404cc72c08b2d1e14506f90d9e877269
    

    #87200

  5. Alexendoo commented on Oct 20, 2021

    @Alexendoo
    Member

    No longer ICEs since #89229

  6. added
    E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.
    on Oct 20, 2021
  7. jackh726 commented on Oct 23, 2021

    @jackh726
    Member

    GATs issue triage: not blocking. Fixed; needs test.

  8. added a commit that references this issue on Nov 9, 2021
    c2f095a
  9. added
    A-GATsArea: Generic associated types (GATs)
    on Nov 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-GATsArea: Generic associated types (GATs)C-bugCategory: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.F-generic_associated_types`#![feature(generic_associated_types)]` a.k.a. GATsF-type_alias_impl_trait`#[feature(type_alias_impl_trait)]`I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions