Auto merge of #60714 - varkor:existential-global-lift-ice, r=oli-obk
Fix ICE with un-feature-gated existential type Fixes https://github.com/rust-lang/rust/issues/60371. r? @oli-obk
This commit is contained in:
commit
5f1924c992
@ -611,26 +611,33 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let new = ty::ResolvedOpaqueTy {
|
if let Some(substs) = self.tcx().lift_to_global(&opaque_defn.substs) {
|
||||||
concrete_type: definition_ty,
|
let new = ty::ResolvedOpaqueTy {
|
||||||
substs: self.tcx().lift_to_global(&opaque_defn.substs).unwrap(),
|
concrete_type: definition_ty,
|
||||||
};
|
substs,
|
||||||
|
};
|
||||||
|
|
||||||
let old = self.tables
|
let old = self.tables
|
||||||
.concrete_existential_types
|
.concrete_existential_types
|
||||||
.insert(def_id, new);
|
.insert(def_id, new);
|
||||||
if let Some(old) = old {
|
if let Some(old) = old {
|
||||||
if old.concrete_type != definition_ty || old.substs != opaque_defn.substs {
|
if old.concrete_type != definition_ty || old.substs != opaque_defn.substs {
|
||||||
span_bug!(
|
span_bug!(
|
||||||
span,
|
span,
|
||||||
"visit_opaque_types tried to write \
|
"visit_opaque_types tried to write \
|
||||||
different types for the same existential type: {:?}, {:?}, {:?}, {:?}",
|
different types for the same existential type: {:?}, {:?}, {:?}, {:?}",
|
||||||
def_id,
|
def_id,
|
||||||
definition_ty,
|
definition_ty,
|
||||||
opaque_defn,
|
opaque_defn,
|
||||||
old,
|
old,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
self.tcx().sess.delay_span_bug(
|
||||||
|
span,
|
||||||
|
"cannot lift `opaque_defn` substs to global type context",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
src/test/ui/existential-type/issue-60371.rs
Normal file
15
src/test/ui/existential-type/issue-60371.rs
Normal file
@ -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
src/test/ui/existential-type/issue-60371.stderr
Normal file
29
src/test/ui/existential-type/issue-60371.stderr
Normal file
@ -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`.
|
Loading…
Reference in New Issue
Block a user