rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
98.54k stars 12.74k forks source link

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

Closed LlewVallis closed 3 years ago

LlewVallis commented 3 years ago

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: ::sub_free_regions 4: ::constrain_opaque_types 5: rustc_typeck::check::regionck::RegionCtxt::visit_fn_body 6: rustc_typeck::check::regionck::::regionck_fn 7: rustc_infer::infer::InferCtxtBuilder::enter 8: rustc_typeck::check::typeck 9: rustc_query_system::dep_graph::graph::DepGraph::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: ::typeck 14: rustc_typeck::collect::type_of::find_opaque_ty_constraints::ConstraintLocator::check 15: ::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::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: ::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::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: ::check_mod_item_types 33: rustc_session::utils::::time 34: rustc_typeck::check_crate 35: rustc_interface::passes::analysis 36: rustc_query_system::dep_graph::graph::DepGraph::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: ::analysis 41: rustc_interface::passes::QueryContext::enter 42: rustc_interface::queries::::enter 43: rustc_span::with_source_map 44: scoped_tls::ScopedKey::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 `::a` #1 [type_of] computing type of `::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 ```

Luro02 commented 3 years ago

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 5 | | where 6 | | T: 'b; | |______________^ | = note: see issue #44265 for more information error[E0658]: where clauses on associated types are unstable --> src/main.rs:4:5 | 4 | / type Iter<'b>: Iterator 5 | | where 6 | | T: 'b; | |______________^ | = note: see issue #44265 for more information error[E0658]: `impl Trait` in type aliases is unstable --> src/main.rs:17:20 | 17 | = iter::FromFn Option<&'b T>>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: see issue #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 Option<&'b T>>; | |__________________________________________________^ | = note: see issue #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 Option<&'b T>>; | |__________________________________________________^ | = note: see issue #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: ::sub_free_regions 4: ::constrain_opaque_types 5: rustc_typeck::check::regionck::RegionCtxt::visit_fn_body 6: rustc_typeck::check::regionck::::regionck_fn 7: rustc_infer::infer::InferCtxtBuilder::enter 8: rustc_typeck::check::typeck 9: rustc_query_system::query::plumbing::get_query_impl 10: ::typeck 11: rustc_typeck::collect::type_of::find_opaque_ty_constraints::ConstraintLocator::check 12: ::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: ::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: ::check_mod_item_types 24: rustc_session::utils::::time 25: rustc_typeck::check_crate 26: rustc_interface::passes::analysis 27: rustc_query_system::query::plumbing::get_query_impl 28: ::analysis 29: rustc_interface::queries::::enter 30: rustc_span::with_source_map 31: rustc_interface::interface::create_compiler_and_run 32: scoped_tls::ScopedKey::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 `::iter` #1 [type_of] computing type of `::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 ```
Luro02 commented 3 years ago
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 ```

rust-lang/rust#87200

Alexendoo commented 3 years ago

No longer ICEs since #89229

jackh726 commented 3 years ago

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