Rollup merge of #57836 - oli-obk:existential_crisis, r=estebank
Fix some cross crate existential type ICEs fixes #53443
This commit is contained in:
commit
d17f62d857
7 changed files with 66 additions and 2 deletions
|
@ -893,6 +893,9 @@ impl<'a, 'tcx> CrateMetadata {
|
||||||
EntryKind::AssociatedType(container) => {
|
EntryKind::AssociatedType(container) => {
|
||||||
(ty::AssociatedKind::Type, container, false)
|
(ty::AssociatedKind::Type, container, false)
|
||||||
}
|
}
|
||||||
|
EntryKind::AssociatedExistential(container) => {
|
||||||
|
(ty::AssociatedKind::Existential, container, false)
|
||||||
|
}
|
||||||
_ => bug!("cannot get associated-item of `{:?}`", def_key)
|
_ => bug!("cannot get associated-item of `{:?}`", def_key)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -680,6 +680,7 @@ impl<'a> Resolver<'a> {
|
||||||
}
|
}
|
||||||
module.populated.set(true);
|
module.populated.set(true);
|
||||||
}
|
}
|
||||||
|
Def::Existential(..) |
|
||||||
Def::TraitAlias(..) => {
|
Def::TraitAlias(..) => {
|
||||||
self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, expansion));
|
self.define(parent, ident, TypeNS, (def, vis, DUMMY_SP, expansion));
|
||||||
}
|
}
|
||||||
|
|
|
@ -608,8 +608,8 @@ fn check_existential_types<'a, 'fcx, 'gcx, 'tcx>(
|
||||||
if let ty::Opaque(def_id, substs) = ty.sty {
|
if let ty::Opaque(def_id, substs) = ty.sty {
|
||||||
trace!("check_existential_types: opaque_ty, {:?}, {:?}", def_id, substs);
|
trace!("check_existential_types: opaque_ty, {:?}, {:?}", def_id, substs);
|
||||||
let generics = tcx.generics_of(def_id);
|
let generics = tcx.generics_of(def_id);
|
||||||
// only check named existential types
|
// only check named existential types defined in this crate
|
||||||
if generics.parent.is_none() {
|
if generics.parent.is_none() && def_id.is_local() {
|
||||||
let opaque_node_id = tcx.hir().as_local_node_id(def_id).unwrap();
|
let opaque_node_id = tcx.hir().as_local_node_id(def_id).unwrap();
|
||||||
if may_define_existential_type(tcx, fn_def_id, opaque_node_id) {
|
if may_define_existential_type(tcx, fn_def_id, opaque_node_id) {
|
||||||
trace!("check_existential_types may define. Generics: {:#?}", generics);
|
trace!("check_existential_types may define. Generics: {:#?}", generics);
|
||||||
|
|
12
src/test/ui/existential_types/auxiliary/cross_crate_ice.rs
Normal file
12
src/test/ui/existential_types/auxiliary/cross_crate_ice.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// Crate that exports an existential type. Used for testing cross-crate.
|
||||||
|
|
||||||
|
#![crate_type="rlib"]
|
||||||
|
|
||||||
|
#![feature(existential_type)]
|
||||||
|
|
||||||
|
pub existential type Foo: std::fmt::Debug;
|
||||||
|
|
||||||
|
pub fn foo() -> Foo {
|
||||||
|
5
|
||||||
|
}
|
||||||
|
|
21
src/test/ui/existential_types/auxiliary/cross_crate_ice2.rs
Normal file
21
src/test/ui/existential_types/auxiliary/cross_crate_ice2.rs
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Crate that exports an existential type. Used for testing cross-crate.
|
||||||
|
|
||||||
|
#![crate_type="rlib"]
|
||||||
|
|
||||||
|
#![feature(existential_type)]
|
||||||
|
|
||||||
|
pub trait View {
|
||||||
|
type Tmp: Iterator<Item = u32>;
|
||||||
|
|
||||||
|
fn test(&self) -> Self::Tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct X;
|
||||||
|
|
||||||
|
impl View for X {
|
||||||
|
existential type Tmp: Iterator<Item = u32>;
|
||||||
|
|
||||||
|
fn test(&self) -> Self::Tmp {
|
||||||
|
vec![1,2,3].into_iter()
|
||||||
|
}
|
||||||
|
}
|
16
src/test/ui/existential_types/cross_crate_ice.rs
Normal file
16
src/test/ui/existential_types/cross_crate_ice.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
// aux-build:cross_crate_ice.rs
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
|
extern crate cross_crate_ice;
|
||||||
|
|
||||||
|
struct Bar(cross_crate_ice::Foo);
|
||||||
|
|
||||||
|
impl Bar {
|
||||||
|
fn zero(&self) -> &cross_crate_ice::Foo {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = cross_crate_ice::foo();
|
||||||
|
}
|
11
src/test/ui/existential_types/cross_crate_ice2.rs
Normal file
11
src/test/ui/existential_types/cross_crate_ice2.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
// aux-build:cross_crate_ice2.rs
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
|
extern crate cross_crate_ice2;
|
||||||
|
|
||||||
|
use cross_crate_ice2::View;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let v = cross_crate_ice2::X;
|
||||||
|
v.test();
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue