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_index::IndexVec;
|
||||||
use rustc_middle::mir::tcx::{PlaceTy, RvalueInitializationState};
|
use rustc_middle::mir::tcx::{PlaceTy, RvalueInitializationState};
|
||||||
use rustc_middle::mir::*;
|
use rustc_middle::mir::*;
|
||||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt};
|
||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
|
|
||||||
use std::mem;
|
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 body = self.builder.body;
|
||||||
let tcx = self.builder.tcx;
|
let tcx = self.builder.tcx;
|
||||||
let place_ty = place_ref.ty(body, tcx).ty;
|
let place_ty = place_ref.ty(body, tcx).ty;
|
||||||
|
if place_ty.references_error() {
|
||||||
|
return MovePathResult::Error;
|
||||||
|
}
|
||||||
match elem {
|
match elem {
|
||||||
ProjectionElem::Deref => match place_ty.kind() {
|
ProjectionElem::Deref => match place_ty.kind() {
|
||||||
ty::Ref(..) | ty::RawPtr(..) => {
|
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