mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Bail out of drop elaboration when encountering error types
This commit is contained in:
parent
1280928a99
commit
2d73597b93
@ -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 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
|
||||
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 New Issue
Block a user