From b2189a1964e70a023857b4a66f1b75dab6dba847 Mon Sep 17 00:00:00 2001 From: Jaemin Hong Date: Fri, 24 May 2024 05:14:44 +0000 Subject: [PATCH] handle let ref binding --- src/tag_analysis.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/tag_analysis.rs b/src/tag_analysis.rs index 9b7c87d..336ff92 100644 --- a/src/tag_analysis.rs +++ b/src/tag_analysis.rs @@ -8,12 +8,12 @@ use compile_util::{make_suggestion, span_to_snippet}; use etrace::{ok_or, some_or}; use must_analysis::Obj; use rustc_abi::{FieldIdx, VariantIdx}; -use rustc_ast::Mutability; +use rustc_ast::{BindingAnnotation, Mutability}; use rustc_hir::{ def::Res, definitions::DefPathDataName, intravisit::{self, Visitor as HVisitor}, - Expr, ExprKind, ItemKind, Node, PatKind, QPath, StmtKind, UnOp, VariantData, + ByRef, Expr, ExprKind, ItemKind, Node, PatKind, QPath, StmtKind, UnOp, VariantData, }; use rustc_index::{bit_set::BitSet, IndexVec}; use rustc_middle::{ @@ -1468,9 +1468,17 @@ fn get_expr_context<'tcx>( } _ => (ExprContext::Value, e), }, - Node::ExprField(_) | Node::Stmt(_) | Node::Local(_) | Node::Block(_) => { - (ExprContext::Value, expr) + Node::Local(rustc_hir::Local { pat, .. }) => { + let PatKind::Binding(BindingAnnotation(by_ref, _), _, _, _) = pat.kind else { + unreachable!() + }; + if by_ref == ByRef::Yes { + (ExprContext::Address, expr) + } else { + (ExprContext::Value, expr) + } } + Node::ExprField(_) | Node::Stmt(_) | Node::Block(_) => (ExprContext::Value, expr), _ => unreachable!("{:?}", parent), } }