Fix box_default
behaviour with empty vec![]
coming from macro arg
This commit is contained in:
parent
7af811b6c4
commit
23d533264f
@ -45,7 +45,7 @@ fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) {
|
|||||||
&& let ExprKind::Path(QPath::TypeRelative(ty, seg)) = box_new.kind
|
&& let ExprKind::Path(QPath::TypeRelative(ty, seg)) = box_new.kind
|
||||||
&& let ExprKind::Call(arg_path, ..) = arg.kind
|
&& let ExprKind::Call(arg_path, ..) = arg.kind
|
||||||
&& !in_external_macro(cx.sess(), expr.span)
|
&& !in_external_macro(cx.sess(), expr.span)
|
||||||
&& (expr.span.eq_ctxt(arg.span) || is_vec_expn(cx, arg))
|
&& (expr.span.eq_ctxt(arg.span) || is_local_vec_expn(cx, arg, expr))
|
||||||
&& seg.ident.name == sym::new
|
&& seg.ident.name == sym::new
|
||||||
&& path_def_id(cx, ty).map_or(false, |id| Some(id) == cx.tcx.lang_items().owned_box())
|
&& path_def_id(cx, ty).map_or(false, |id| Some(id) == cx.tcx.lang_items().owned_box())
|
||||||
&& is_default_equivalent(cx, arg)
|
&& is_default_equivalent(cx, arg)
|
||||||
@ -81,10 +81,10 @@ fn is_plain_default(cx: &LateContext<'_>, arg_path: &Expr<'_>) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_vec_expn(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
fn is_local_vec_expn(cx: &LateContext<'_>, expr: &Expr<'_>, ref_expr: &Expr<'_>) -> bool {
|
||||||
macro_backtrace(expr.span)
|
macro_backtrace(expr.span).next().map_or(false, |call| {
|
||||||
.next()
|
cx.tcx.is_diagnostic_item(sym::vec_macro, call.def_id) && call.span.eq_ctxt(ref_expr.span)
|
||||||
.map_or(false, |call| cx.tcx.is_diagnostic_item(sym::vec_macro, call.def_id))
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
|
@ -90,3 +90,17 @@ fn issue_10381() {
|
|||||||
|
|
||||||
assert!(maybe_get_bar(2).is_some());
|
assert!(maybe_get_bar(2).is_some());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
fn issue_11868() {
|
||||||
|
fn foo(_: &mut Vec<usize>) {}
|
||||||
|
|
||||||
|
macro_rules! bar {
|
||||||
|
($baz:expr) => {
|
||||||
|
Box::leak(Box::new($baz))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
foo(bar!(vec![]));
|
||||||
|
foo(bar!(vec![1]));
|
||||||
|
}
|
||||||
|
@ -90,3 +90,17 @@ fn maybe_get_bar(i: u32) -> Option<Box<dyn Bar>> {
|
|||||||
|
|
||||||
assert!(maybe_get_bar(2).is_some());
|
assert!(maybe_get_bar(2).is_some());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(unused)]
|
||||||
|
fn issue_11868() {
|
||||||
|
fn foo(_: &mut Vec<usize>) {}
|
||||||
|
|
||||||
|
macro_rules! bar {
|
||||||
|
($baz:expr) => {
|
||||||
|
Box::leak(Box::new($baz))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
foo(bar!(vec![]));
|
||||||
|
foo(bar!(vec![1]));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user