diff --git a/pin-project-internal/src/project.rs b/pin-project-internal/src/project.rs index ed1a5fa7..83e8cb20 100644 --- a/pin-project-internal/src/project.rs +++ b/pin-project-internal/src/project.rs @@ -208,10 +208,7 @@ fn replace_item_fn(item: &mut ItemFn, mutability: Mutability) -> Result<()> { fn visit_stmt(&mut self, node: &mut Stmt) -> Result<()> { match node { - Stmt::Expr(expr) | Stmt::Semi(expr, _) => { - visit_mut::visit_expr_mut(self, expr); - self.visit_expr(expr) - } + Stmt::Expr(expr) | Stmt::Semi(expr, _) => self.visit_expr(expr), Stmt::Local(local) => { visit_mut::visit_local_mut(self, local); if let Some(attr) = local.attrs.find_remove(self.name())? { @@ -226,6 +223,7 @@ fn replace_item_fn(item: &mut ItemFn, mutability: Mutability) -> Result<()> { } fn visit_expr(&mut self, node: &mut Expr) -> Result<()> { + visit_mut::visit_expr_mut(self, node); let attr = match node { Expr::Match(expr) => expr.attrs.find_remove(self.name())?, Expr::If(expr_if) => { diff --git a/tests/project.rs b/tests/project.rs index 75f55b55..9b5722a8 100644 --- a/tests/project.rs +++ b/tests/project.rs @@ -204,3 +204,33 @@ fn non_stmt_expr_match() { }, ); } + +// https://github.com/taiki-e/pin-project/issues/206 +#[test] +#[project] +fn issue_206() { + #[pin_project] + enum Enum { + Variant(#[pin] A), + } + + let mut x = Enum::Variant(1); + let x = Pin::new(&mut x).project(); + + Some({ + #[project] + match &x { + Enum::Variant(_) => {} + } + }); + + loop { + let _ = { + #[project] + match &x { + Enum::Variant(_) => {} + } + }; + break; + } +}