Skip to content

Commit

Permalink
Auto merge of #60714 - varkor:existential-global-lift-ice, r=oli-obk
Browse files Browse the repository at this point in the history
Fix ICE with un-feature-gated existential type

Fixes #60371.

r? @oli-obk
  • Loading branch information
bors committed May 11, 2019
2 parents af39a1f + aa9369c commit 5f1924c
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 19 deletions.
45 changes: 26 additions & 19 deletions src/librustc_typeck/check/writeback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -611,26 +611,33 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
}
}

let new = ty::ResolvedOpaqueTy {
concrete_type: definition_ty,
substs: self.tcx().lift_to_global(&opaque_defn.substs).unwrap(),
};

let old = self.tables
.concrete_existential_types
.insert(def_id, new);
if let Some(old) = old {
if old.concrete_type != definition_ty || old.substs != opaque_defn.substs {
span_bug!(
span,
"visit_opaque_types tried to write \
different types for the same existential type: {:?}, {:?}, {:?}, {:?}",
def_id,
definition_ty,
opaque_defn,
old,
);
if let Some(substs) = self.tcx().lift_to_global(&opaque_defn.substs) {
let new = ty::ResolvedOpaqueTy {
concrete_type: definition_ty,
substs,
};

let old = self.tables
.concrete_existential_types
.insert(def_id, new);
if let Some(old) = old {
if old.concrete_type != definition_ty || old.substs != opaque_defn.substs {
span_bug!(
span,
"visit_opaque_types tried to write \
different types for the same existential type: {:?}, {:?}, {:?}, {:?}",
def_id,
definition_ty,
opaque_defn,
old,
);
}
}
} else {
self.tcx().sess.delay_span_bug(
span,
"cannot lift `opaque_defn` substs to global type context",
);
}
}
}
Expand Down
15 changes: 15 additions & 0 deletions src/test/ui/existential-type/issue-60371.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
trait Bug {
type Item: Bug;

const FUN: fn() -> Self::Item;
}

impl Bug for &() {
existential type Item: Bug; //~ ERROR existential types are unstable
//~^ ERROR the trait bound `(): Bug` is not satisfied
//~^^ ERROR could not find defining uses

const FUN: fn() -> Self::Item = || ();
}

fn main() {}
29 changes: 29 additions & 0 deletions src/test/ui/existential-type/issue-60371.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
error[E0658]: existential types are unstable
--> $DIR/issue-60371.rs:8:5
|
LL | existential type Item: Bug;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: for more information, see https://github.com/rust-lang/rust/issues/34511
= help: add #![feature(existential_type)] to the crate attributes to enable

error[E0277]: the trait bound `(): Bug` is not satisfied
--> $DIR/issue-60371.rs:8:5
|
LL | existential type Item: Bug;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Bug` is not implemented for `()`
|
= help: the following implementations were found:
<&() as Bug>
= note: the return type of a function must have a statically known size

error: could not find defining uses
--> $DIR/issue-60371.rs:8:5
|
LL | existential type Item: Bug;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 3 previous errors

Some errors have detailed explanations: E0277, E0658.
For more information about an error, try `rustc --explain E0277`.

0 comments on commit 5f1924c

Please sign in to comment.