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 crash with type alias of impl trait #63677

Open
shootingsyh opened this issue Aug 18, 2019 · 9 comments · May be fixed by #63934

Comments

@shootingsyh
Copy link

commented Aug 18, 2019

I cannot provide a simple repro yet. But what I did is mostly define a type alias of an impl trait and use it as generic parameter of another type. And here is the stack trace

error: internal compiler error: src/librustc/traits/coherence.rs:523: ty_is_local invoked on unexpected type: TimerStream

thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:643:9
stack backtrace:
   0:        0x1106295e2 - std::panicking::default_hook::{{closure}}::hab1ab34f1ce96caa
   1:        0x1106292ad - std::panicking::default_hook::h64b790c24fa7fc49
   2:        0x10f34ca03 - rustc::util::common::panic_hook::h5f0c42b9b5f5c860
   3:        0x110629ea1 - std::panicking::rust_panic_with_hook::hb4f2ed402a5c2512
   4:        0x10f6fef51 - std::panicking::begin_panic::hc70c89798bac02e9
   5:        0x10f718a1e - rustc_errors::Handler::bug::h5baeb98a8a0678a0
   6:        0x10f03e62b - rustc::util::bug::opt_span_bug_fmt::{{closure}}::h6d481064c64d9070
   7:        0x10f038d46 - rustc::ty::context::tls::with_opt::{{closure}}::heed197f8ba0676ae
   8:        0x10f038514 - rustc::ty::context::tls::with_context_opt::hec55cd2ecdfd7b1e
   9:        0x10f038542 - rustc::ty::context::tls::with_opt::hcb84b0e0c6e44f43
  10:        0x10f03e548 - rustc::util::bug::opt_span_bug_fmt::h36d0f65a1fdc8719
  11:        0x10f03e49b - rustc::util::bug::bug_fmt::h82ba15a6bd0a15f1
  12:        0x10f01420a - rustc::traits::coherence::ty_is_local_constructor::h114dccfe228be3db
  13:        0x10f013f6d - rustc::traits::coherence::ty_is_local::hebc4f08163a8f32c
  14:        0x10f0139cb - rustc::traits::coherence::orphan_check_trait_ref::ha29c20ab5632e1a2
  15:        0x10f0135e2 - rustc::traits::coherence::trait_ref_is_knowable::he4651b1a389892b5
  16:        0x10f3295a7 - rustc::traits::select::SelectionContext::candidate_from_obligation_no_cache::hef619078f305ea6c
  17:        0x10ee02e33 - rustc::dep_graph::graph::DepGraph::with_anon_task::h9c7fbd897a8b74af
  18:        0x10f329039 - rustc::traits::select::SelectionContext::candidate_from_obligation::h91204ae0cd40ca57
  19:        0x10f32838d - rustc::traits::select::SelectionContext::evaluate_stack::hdccb6e4735e69c64
  20:        0x10ee02a9b - rustc::dep_graph::graph::DepGraph::with_anon_task::h1983365f787ed581
  21:        0x10f326dac - rustc::traits::select::SelectionContext::evaluate_predicate_recursively::hbbad24ee512cbcfa
  22:        0x10f3259e3 - rustc::traits::select::SelectionContext::evaluate_predicates_recursively::h6b77f200c3916542
  23:        0x10effc467 - rustc::infer::InferCtxt::probe::h46c73949432589d0
  24:        0x10f328420 - rustc::traits::select::SelectionContext::evaluate_stack::hdccb6e4735e69c64
  25:        0x10ee02a9b - rustc::dep_graph::graph::DepGraph::with_anon_task::h1983365f787ed581
  26:        0x10f326dac - rustc::traits::select::SelectionContext::evaluate_predicate_recursively::hbbad24ee512cbcfa
  27:        0x10effd017 - rustc::infer::InferCtxt::probe::h9b9c357204ffa5a5
  28:        0x10f366558 - core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut::hc4c9d32f4ddb802a
  29:        0x10f3014b6 - <core::slice::Iter<T> as core::iter::traits::iterator::Iterator>::try_fold::h08089fe9896ed2ce
  30:        0x10f2cdc11 - <core::iter::adapters::chain::Chain<A,B> as core::iter::traits::iterator::Iterator>::try_fold::h15c19b5ccfa88730
  31:        0x10f01300b - rustc::traits::coherence::overlap::hfed74e82ba05c75e
  32:        0x10e266e58 - rustc::ty::context::GlobalCtxt::enter_local::h49b342d271f1b96c
  33:        0x10e2fd172 - rustc::traits::coherence::overlapping_impls::h14e3a1cc484a2e15
  34:        0x10e149785 - <rustc_typeck::coherence::inherent_impls_overlap::InherentOverlapChecker as rustc::hir::itemlikevisit::ItemLikeVisitor>::visit_item::haa87c78d85f603c3
  35:        0x10e148b6b - rustc_typeck::coherence::inherent_impls_overlap::crate_inherent_impls_overlap_check::h5714823a4b6013ef
  36:        0x10e15b342 - rustc::ty::query::__query_compute::crate_inherent_impls_overlap_check::hec25e21ca4400cff
  37:        0x10e19206b - rustc::dep_graph::graph::DepGraph::with_task_impl::hdb035c1d37fe2a13
  38:        0x10e241a26 - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::hc5bc0d0da4f194ab
  39:        0x10e304300 - rustc_typeck::coherence::check_coherence::he7286af5c662a030
  40:        0x10e15c9ad - rustc::util::common::time::h2a7c97de8a318682
  41:        0x10e30512c - rustc_typeck::check_crate::hd110f4e4742d4bb0
  42:        0x10dcadd12 - rustc_interface::passes::analysis::h3fd78df98efc9ff0
  43:        0x10dbb4bae - rustc::ty::query::__query_compute::analysis::h353a45c1e4e47295
  44:        0x10dbc520b - rustc::dep_graph::graph::DepGraph::with_task_impl::hb88490dc2932c48f
  45:        0x10dbcf865 - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::h30f3db9b52216656
  46:        0x10dbeb2d7 - rustc::ty::context::tls::enter_global::h2b05f3b892a0fe2a
  47:        0x10dbd530c - rustc_interface::passes::BoxedGlobalCtxt::access::{{closure}}::hef054cc95c28e706
  48:        0x10dd03e5c - rustc_interface::passes::create_global_ctxt::{{closure}}::hc6fa2edd634a5176
  49:        0x10dbd61f4 - rustc_interface::interface::run_compiler_in_existing_thread_pool::h04de03e7b31bec3d
  50:        0x10dc08664 - std::thread::local::LocalKey<T>::with::h6300b72366cd4201
  51:        0x10dc0fa82 - scoped_tls::ScopedKey<T>::set::h95306a0884a1982c
  52:        0x10dc408e5 - syntax::with_globals::ha28675c52e11d2e2
  53:        0x10dbb0e47 - std::sys_common::backtrace::__rust_begin_short_backtrace::hf20192de0d0e5526
  54:        0x11063927f - __rust_maybe_catch_panic
  55:        0x10dbd8b67 - core::ops::function::FnOnce::call_once{{vtable.shim}}::h520e25e0f997e8ef
  56:        0x11060d13e - <alloc::boxed::Box<F> as core::ops::function::FnOnce<A>>::call_once::h8743b96d38f43bdd
  57:        0x11063808e - std::sys::unix::thread::Thread::new::thread_start::hf6abe31b14f3b029
  58:     0x7fff711f12eb - _pthread_body
  59:     0x7fff711f4249 - _pthread_start
query stack during panic:
#0 [crate_inherent_impls_overlap_check] check for overlap between inherent impls defined in this crate
#1 [analysis] running analysis passes on this crate
end of query stack
error: aborting due to previous error



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

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.39.0-nightly (2111aed0a 2019-08-17) running on x86_64-apple-darwin

note: compiler flags: -C debuginfo=2 -C incremental --crate-type lib

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

This comment has been minimized.

Copy link
Contributor

commented Aug 18, 2019

@shootingsyh: Are you able to provide the repository that reproduces this?

@shootingsyh

This comment has been minimized.

Copy link
Author

commented Aug 18, 2019

Sorry it’s still under very early developing, so I haven’t open it. I’m trying to figure out a repro though

@shootingsyh

This comment has been minimized.

Copy link
Author

commented Aug 19, 2019

Still cannot find a simple repro. I decided to public my work at https://github.com/shootingsyh/rxstream, and here is patch of my local change:
patch2.txt (Updated with correct patch)

Apply the patch, cargo build with the nightly version, it will crash like that.
Sorry I cannot isolate the issue further. And I'm too new for rust, and this issue happens quite a while ago, almost forgot what I was doing there...

cc @Aaron1011

@hellow554

This comment has been minimized.

Copy link
Contributor

commented Aug 19, 2019

@shootingsyh

error[E0583]: file not found for module `overlapped_time_buffer`
 --> src/operators/transform/mod.rs:6:9
  |
6 | pub mod overlapped_time_buffer;
  |         ^^^^^^^^^^^^^^^^^^^^^^
  |
  = help: name the file either overlapped_time_buffer.rs or overlapped_time_buffer/mod.rs inside the directory "src/operators/transform"

If I remove that pub mod (and resolve the other issues) it doesn't ICE on my machine. :/

@shootingsyh

This comment has been minimized.

Copy link
Author

commented Aug 19, 2019

@hellow554 how did you get this error? use cargo build?
BTW, did you get the local change patch.txt applied? The patch is where I use the impl trait thing.
https://github.com/rust-lang/rust/files/3518790/patch2.txt (Updated with correct patch)

@hellow554

This comment has been minimized.

Copy link
Contributor

commented Aug 19, 2019

@shootingsyh

cd $(mktemp -d)
git clone https://github.com/shootingsyh/rxstream
cd rxstream
wget https://github.com/rust-lang/rust/files/3514385/patch.txt
patch -p1 < patch.txt
cargo build
@shootingsyh

This comment has been minimized.

Copy link
Author

commented Aug 20, 2019

Hmmm, sorry didn't add the src/operators/transform/overlapped_time_buffer.rs file into my diff...
Here is the updated patch. Also updated the previous comments and issue
patch2.txt

@hellow554

This comment has been minimized.

Copy link
Contributor

commented Aug 20, 2019

This is small-ish, I'm not sure if it can be simplified further:

#![feature(type_alias_impl_trait)]

pub trait Trait {}
pub struct S1<T>(T);
pub struct S2<T>(T);

pub type T1 = impl Trait;
pub type T2 = S1<T1>;
pub type T3 = S2<T2>;

impl<T> Trait for S1<T> {}
impl<T: Trait> S2<T> {}
impl T3 {}

pub fn use_t1() -> T1 { S1(()) }

(I Hope the names don't confuse you ;) )

@hellow554

This comment was marked as resolved.

Copy link
Contributor

commented Aug 20, 2019

@rustbot modify labels: -E-needs-mcve

@rustbot rustbot removed the E-needs-mcve label Aug 20, 2019

Aaron1011 added a commit to Aaron1011/rust that referenced this issue Aug 27, 2019
Fix coherence checking for impl trait in type aliases
Fixes rust-lang#63677

RFC rust-lang#2071 (impl-trait-existential-types) does not explicitly state how
impl trait type alises should interact with coherence. However, there's
only one choice which makes sense - coherence should look at the
underlying type (i.e. the 'defining' type of the impl trait) of the type
alias, just like we do for non-impl-trait type aliases.

Specifically, impl trait type alises which resolve to a local type
should be treated like a local type with respect to coherence (e.g.
impl trait type aliases which resolve to a forieign type should be
treated as a foreign type, and those that resolve to a local type should
be treated as a local type).

Since neither inherent impls nor direct trait impl (i.e. `impl MyType`
or `impl MyTrait for MyType`) are allowd for type aliases, this
usually does not come up. Before we ever attempt to do coherence
checking, we will have errored out if an impl trait type alias was used
directly in an 'impl' clause.

However, during trait selection, we sometimes need to prove bounds like
'T: Sized' for some type 'T'. If 'T' is an impl trait type alias, this
requires to know the coherence behavior for impl trait type aliases when
we perform coherence checking.

Note: Since determining the underlying type of an impl trait type alias
requires us to perform body type checking, this commit causes us to type
check some bodies easlier than we otherwise would have. However, since
this is done through a query, this shouldn't cause any problems

For completeness, I've added an additional test of the coherence-related
behavior of impl trait type aliases.
@Aaron1011 Aaron1011 referenced a pull request that will close this issue Aug 27, 2019
Aaron1011 added a commit to Aaron1011/rust that referenced this issue Sep 18, 2019
Fix coherence check for opaque type
Fixes rust-lang#63677

This commit treats all opaque types as 'remote' with respect to
coherence checking, instead of causing an ICE. This ensures that opaque
types cannot ever 'leak' information about the underlying type (e.g.
whether or not it is a local or remote type)
Aaron1011 added a commit to Aaron1011/rust that referenced this issue Sep 18, 2019
Fix coherence check for opaque type
Fixes rust-lang#63677

This commit treats all opaque types as 'remote' with respect to
coherence checking, instead of causing an ICE. This ensures that opaque
types cannot ever 'leak' information about the underlying type (e.g.
whether or not it is a local or remote type)
Aaron1011 added a commit to Aaron1011/rust that referenced this issue Sep 18, 2019
Fix coherence check for opaque type
Fixes rust-lang#63677

This commit treats all opaque types as 'remote' with respect to
coherence checking, instead of causing an ICE. This ensures that opaque
types cannot ever 'leak' information about the underlying type (e.g.
whether or not it is a local or remote type)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
6 participants
You can’t perform that action at this time.