mirror of
https://github.com/rust-lang/rust
synced 2024-11-05 20:45:15 +00:00
Bail out of drop elaboration when encountering error types
This commit is contained in:
parent
1280928a99
commit
2d73597b93
3 changed files with 38 additions and 1 deletions
|
@ -1,7 +1,7 @@
|
|||
use rustc_index::IndexVec;
|
||||
use rustc_middle::mir::tcx::{PlaceTy, RvalueInitializationState};
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt};
|
||||
use smallvec::{smallvec, SmallVec};
|
||||
|
||||
use std::mem;
|
||||
|
@ -132,6 +132,9 @@ fn move_path_for(&mut self, place: Place<'tcx>) -> MovePathResult {
|
|||
let body = self.builder.body;
|
||||
let tcx = self.builder.tcx;
|
||||
let place_ty = place_ref.ty(body, tcx).ty;
|
||||
if place_ty.references_error() {
|
||||
return MovePathResult::Error;
|
||||
}
|
||||
match elem {
|
||||
ProjectionElem::Deref => match place_ty.kind() {
|
||||
ty::Ref(..) | ty::RawPtr(..) => {
|
||||
|
|
20
tests/ui/drop/drop_elaboration_with_errors.rs
Normal file
20
tests/ui/drop/drop_elaboration_with_errors.rs
Normal file
|
@ -0,0 +1,20 @@
|
|||
// can't use build-fail, because this also fails check-fail, but
|
||||
// the ICE from #120787 only reproduces on build-fail.
|
||||
// compile-flags: --emit=mir
|
||||
|
||||
#![feature(type_alias_impl_trait)]
|
||||
|
||||
struct Foo {
|
||||
field: String,
|
||||
}
|
||||
|
||||
type Tait = impl Sized;
|
||||
|
||||
fn ice_cold(beverage: Tait) {
|
||||
let Foo { field } = beverage;
|
||||
_ = field;
|
||||
}
|
||||
|
||||
fn main() {
|
||||
Ok(()) //~ ERROR mismatched types
|
||||
}
|
14
tests/ui/drop/drop_elaboration_with_errors.stderr
Normal file
14
tests/ui/drop/drop_elaboration_with_errors.stderr
Normal file
|
@ -0,0 +1,14 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/drop_elaboration_with_errors.rs:19:5
|
||||
|
|
||||
LL | fn main() {
|
||||
| - expected `()` because of default return type
|
||||
LL | Ok(())
|
||||
| ^^^^^^ expected `()`, found `Result<(), _>`
|
||||
|
|
||||
= note: expected unit type `()`
|
||||
found enum `Result<(), _>`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Reference in a new issue