Skip to content

Commit

Permalink
Auto merge of #78432 - sexxi-goose:fix-77993-take3, r=nikomatsakis
Browse files Browse the repository at this point in the history
Handle type errors in closure/generator upvar_tys

Fixes #77993
  • Loading branch information
bors committed Oct 30, 2020
2 parents c792f03 + 5229571 commit 0d33ab7
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 6 deletions.
43 changes: 37 additions & 6 deletions compiler/rustc_middle/src/ty/sty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -388,9 +388,19 @@ impl<'tcx> ClosureSubsts<'tcx> {
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]
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.
Expand Down Expand Up @@ -515,9 +525,19 @@ impl<'tcx> GeneratorSubsts<'tcx> {
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]
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.
Expand Down Expand Up @@ -660,13 +680,24 @@ pub enum 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]
pub fn upvar_tys(self) -> impl Iterator<Item = Ty<'tcx>> + 'tcx {
let tupled_upvars_ty = match self {
UpvarSubsts::Closure(substs) => substs.as_closure().split().tupled_upvars_ty,
UpvarSubsts::Generator(substs) => substs.as_generator().split().tupled_upvars_ty,
let tupled_tys = match self {
UpvarSubsts::Closure(substs) => substs.as_closure().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]
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/issues/issue-77993-1.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 16 additions & 0 deletions src/test/ui/issues/issue-77993-1.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 9 additions & 0 deletions src/test/ui/issues/issue-77993-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// edition:2018

async fn test() -> Result<(), Box<dyn std::error::Error>> {
macro!();
//~^ ERROR expected identifier, found `!`
Ok(())
}

fn main() {}
8 changes: 8 additions & 0 deletions src/test/ui/issues/issue-77993-2.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 0d33ab7

Please sign in to comment.