Auto merge of #78432 - sexxi-goose:fix-77993-take3, r=nikomatsakis
Handle type errors in closure/generator upvar_tys Fixes #77993
This commit is contained in:
commit
0d33ab7af4
@ -388,9 +388,19 @@ impl<'tcx> ClosureSubsts<'tcx> {
|
|||||||
self.split().parent_substs
|
self.split().parent_substs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an iterator over the list of types of captured paths by the closure.
|
||||||
|
/// In case there was a type error in figuring out the types of the captured path, an
|
||||||
|
/// empty iterator is returned.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
||||||
self.tupled_upvars_ty().tuple_fields()
|
match self.tupled_upvars_ty().kind() {
|
||||||
|
TyKind::Error(_) => None,
|
||||||
|
TyKind::Tuple(..) => Some(self.tupled_upvars_ty().tuple_fields()),
|
||||||
|
TyKind::Infer(_) => bug!("upvar_tys called before capture types are inferred"),
|
||||||
|
ty => bug!("Unexpected representation of upvar types tuple {:?}", ty),
|
||||||
|
}
|
||||||
|
.into_iter()
|
||||||
|
.flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the tuple type representing the upvars for this closure.
|
/// Returns the tuple type representing the upvars for this closure.
|
||||||
@ -515,9 +525,19 @@ impl<'tcx> GeneratorSubsts<'tcx> {
|
|||||||
self.split().witness.expect_ty()
|
self.split().witness.expect_ty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an iterator over the list of types of captured paths by the generator.
|
||||||
|
/// In case there was a type error in figuring out the types of the captured path, an
|
||||||
|
/// empty iterator is returned.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
||||||
self.tupled_upvars_ty().tuple_fields()
|
match self.tupled_upvars_ty().kind() {
|
||||||
|
TyKind::Error(_) => None,
|
||||||
|
TyKind::Tuple(..) => Some(self.tupled_upvars_ty().tuple_fields()),
|
||||||
|
TyKind::Infer(_) => bug!("upvar_tys called before capture types are inferred"),
|
||||||
|
ty => bug!("Unexpected representation of upvar types tuple {:?}", ty),
|
||||||
|
}
|
||||||
|
.into_iter()
|
||||||
|
.flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the tuple type representing the upvars for this generator.
|
/// Returns the tuple type representing the upvars for this generator.
|
||||||
@ -660,13 +680,24 @@ pub enum UpvarSubsts<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> UpvarSubsts<'tcx> {
|
impl<'tcx> UpvarSubsts<'tcx> {
|
||||||
|
/// Returns an iterator over the list of types of captured paths by the closure/generator.
|
||||||
|
/// In case there was a type error in figuring out the types of the captured path, an
|
||||||
|
/// empty iterator is returned.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
|
||||||
let tupled_upvars_ty = match self {
|
let tupled_tys = match self {
|
||||||
UpvarSubsts::Closure(substs) => substs.as_closure().split().tupled_upvars_ty,
|
UpvarSubsts::Closure(substs) => substs.as_closure().tupled_upvars_ty(),
|
||||||
UpvarSubsts::Generator(substs) => substs.as_generator().split().tupled_upvars_ty,
|
UpvarSubsts::Generator(substs) => substs.as_generator().tupled_upvars_ty(),
|
||||||
};
|
};
|
||||||
tupled_upvars_ty.expect_ty().tuple_fields()
|
|
||||||
|
match tupled_tys.kind() {
|
||||||
|
TyKind::Error(_) => None,
|
||||||
|
TyKind::Tuple(..) => Some(self.tupled_upvars_ty().tuple_fields()),
|
||||||
|
TyKind::Infer(_) => bug!("upvar_tys called before capture types are inferred"),
|
||||||
|
ty => bug!("Unexpected representation of upvar types tuple {:?}", ty),
|
||||||
|
}
|
||||||
|
.into_iter()
|
||||||
|
.flatten()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
12
src/test/ui/issues/issue-77993-1.rs
Normal file
12
src/test/ui/issues/issue-77993-1.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#[derive(Clone)]
|
||||||
|
struct InGroup<F> {
|
||||||
|
it: It,
|
||||||
|
//~^ ERROR cannot find type `It` in this scope
|
||||||
|
f: F,
|
||||||
|
}
|
||||||
|
fn dates_in_year() -> impl Clone {
|
||||||
|
InGroup { f: |d| d }
|
||||||
|
//~^ ERROR missing field `it` in initializer of `InGroup<_>`
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
16
src/test/ui/issues/issue-77993-1.stderr
Normal file
16
src/test/ui/issues/issue-77993-1.stderr
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
error[E0412]: cannot find type `It` in this scope
|
||||||
|
--> $DIR/issue-77993-1.rs:3:9
|
||||||
|
|
|
||||||
|
LL | it: It,
|
||||||
|
| ^^ not found in this scope
|
||||||
|
|
||||||
|
error[E0063]: missing field `it` in initializer of `InGroup<_>`
|
||||||
|
--> $DIR/issue-77993-1.rs:8:5
|
||||||
|
|
|
||||||
|
LL | InGroup { f: |d| d }
|
||||||
|
| ^^^^^^^ missing `it`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0063, E0412.
|
||||||
|
For more information about an error, try `rustc --explain E0063`.
|
9
src/test/ui/issues/issue-77993-2.rs
Normal file
9
src/test/ui/issues/issue-77993-2.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// edition:2018
|
||||||
|
|
||||||
|
async fn test() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
macro!();
|
||||||
|
//~^ ERROR expected identifier, found `!`
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
8
src/test/ui/issues/issue-77993-2.stderr
Normal file
8
src/test/ui/issues/issue-77993-2.stderr
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
error: expected identifier, found `!`
|
||||||
|
--> $DIR/issue-77993-2.rs:4:10
|
||||||
|
|
|
||||||
|
LL | macro!();
|
||||||
|
| ^ expected identifier
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
Reference in New Issue
Block a user