Auto merge of #101212 - eholk:dyn-star, r=compiler-errors
Initial implementation of dyn* This PR adds extremely basic and incomplete support for [dyn*](https://smallcultfollowing.com/babysteps//blog/2022/03/29/dyn-can-we-make-dyn-sized/). The goal is to get something in tree behind a flag to make collaboration easier, and also to make sure the implementation so far is not unreasonable. This PR does quite a few things: * Introduce `dyn_star` feature flag * Adds parsing for `dyn* Trait` types * Defines `dyn* Trait` as a sized type * Adds support for explicit casts, like `42usize as dyn* Debug` * Including const evaluation of such casts * Adds codegen for drop glue so things are cleaned up properly when a `dyn* Trait` object goes out of scope * Adds codegen for method calls, at least for methods that take `&self` Quite a bit is still missing, but this gives us a starting point. Note that this is never intended to become stable surface syntax for Rust, but rather `dyn*` is planned to be used as an implementation detail for async functions in dyn traits. Joint work with `@nikomatsakis` and `@compiler-errors.` r? `@bjorn3`
This commit is contained in:
commit
e4d2f94a83
2 changed files with 6 additions and 1 deletions
|
@ -701,6 +701,10 @@ fn codegen_stmt<'tcx>(
|
||||||
let operand = codegen_operand(fx, operand);
|
let operand = codegen_operand(fx, operand);
|
||||||
operand.unsize_value(fx, lval);
|
operand.unsize_value(fx, lval);
|
||||||
}
|
}
|
||||||
|
Rvalue::Cast(CastKind::DynStar, _, _) => {
|
||||||
|
// FIXME(dyn-star)
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
Rvalue::Discriminant(place) => {
|
Rvalue::Discriminant(place) => {
|
||||||
let place = codegen_place(fx, place);
|
let place = codegen_place(fx, place);
|
||||||
let value = place.to_cvalue(fx);
|
let value = place.to_cvalue(fx);
|
||||||
|
|
|
@ -815,7 +815,8 @@ pub(crate) fn assert_assignable<'tcx>(
|
||||||
);
|
);
|
||||||
// fn(&T) -> for<'l> fn(&'l T) is allowed
|
// fn(&T) -> for<'l> fn(&'l T) is allowed
|
||||||
}
|
}
|
||||||
(&ty::Dynamic(from_traits, _), &ty::Dynamic(to_traits, _)) => {
|
(&ty::Dynamic(from_traits, _, _from_kind), &ty::Dynamic(to_traits, _, _to_kind)) => {
|
||||||
|
// FIXME(dyn-star): Do the right thing with DynKinds
|
||||||
for (from, to) in from_traits.iter().zip(to_traits) {
|
for (from, to) in from_traits.iter().zip(to_traits) {
|
||||||
let from =
|
let from =
|
||||||
fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), from);
|
fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), from);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue