Suggest Option<&T>
instead of &Option<T>
This commit is contained in:
parent
b367d3422c
commit
73a16c10db
@ -5871,6 +5871,7 @@ Released 2018-09-13
|
|||||||
[`ref_as_ptr`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_as_ptr
|
[`ref_as_ptr`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_as_ptr
|
||||||
[`ref_binding_to_reference`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_binding_to_reference
|
[`ref_binding_to_reference`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_binding_to_reference
|
||||||
[`ref_in_deref`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_in_deref
|
[`ref_in_deref`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_in_deref
|
||||||
|
[`ref_option`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_option
|
||||||
[`ref_option_ref`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_option_ref
|
[`ref_option_ref`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_option_ref
|
||||||
[`ref_patterns`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_patterns
|
[`ref_patterns`]: https://rust-lang.github.io/rust-clippy/master/index.html#ref_patterns
|
||||||
[`regex_macro`]: https://rust-lang.github.io/rust-clippy/master/index.html#regex_macro
|
[`regex_macro`]: https://rust-lang.github.io/rust-clippy/master/index.html#regex_macro
|
||||||
|
@ -353,6 +353,7 @@ Suppress lints whenever the suggested change would cause breakage for other crat
|
|||||||
* [`rc_buffer`](https://rust-lang.github.io/rust-clippy/master/index.html#rc_buffer)
|
* [`rc_buffer`](https://rust-lang.github.io/rust-clippy/master/index.html#rc_buffer)
|
||||||
* [`rc_mutex`](https://rust-lang.github.io/rust-clippy/master/index.html#rc_mutex)
|
* [`rc_mutex`](https://rust-lang.github.io/rust-clippy/master/index.html#rc_mutex)
|
||||||
* [`redundant_allocation`](https://rust-lang.github.io/rust-clippy/master/index.html#redundant_allocation)
|
* [`redundant_allocation`](https://rust-lang.github.io/rust-clippy/master/index.html#redundant_allocation)
|
||||||
|
* [`ref_option`](https://rust-lang.github.io/rust-clippy/master/index.html#ref_option)
|
||||||
* [`single_call_fn`](https://rust-lang.github.io/rust-clippy/master/index.html#single_call_fn)
|
* [`single_call_fn`](https://rust-lang.github.io/rust-clippy/master/index.html#single_call_fn)
|
||||||
* [`trivially_copy_pass_by_ref`](https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref)
|
* [`trivially_copy_pass_by_ref`](https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref)
|
||||||
* [`unnecessary_box_returns`](https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_box_returns)
|
* [`unnecessary_box_returns`](https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_box_returns)
|
||||||
|
@ -378,6 +378,7 @@ pub fn get_configuration_metadata() -> Vec<ClippyConfiguration> {
|
|||||||
rc_buffer,
|
rc_buffer,
|
||||||
rc_mutex,
|
rc_mutex,
|
||||||
redundant_allocation,
|
redundant_allocation,
|
||||||
|
ref_option,
|
||||||
single_call_fn,
|
single_call_fn,
|
||||||
trivially_copy_pass_by_ref,
|
trivially_copy_pass_by_ref,
|
||||||
unnecessary_box_returns,
|
unnecessary_box_returns,
|
||||||
|
@ -202,6 +202,7 @@
|
|||||||
crate::functions::MUST_USE_CANDIDATE_INFO,
|
crate::functions::MUST_USE_CANDIDATE_INFO,
|
||||||
crate::functions::MUST_USE_UNIT_INFO,
|
crate::functions::MUST_USE_UNIT_INFO,
|
||||||
crate::functions::NOT_UNSAFE_PTR_ARG_DEREF_INFO,
|
crate::functions::NOT_UNSAFE_PTR_ARG_DEREF_INFO,
|
||||||
|
crate::functions::REF_OPTION_INFO,
|
||||||
crate::functions::RENAMED_FUNCTION_PARAMS_INFO,
|
crate::functions::RENAMED_FUNCTION_PARAMS_INFO,
|
||||||
crate::functions::RESULT_LARGE_ERR_INFO,
|
crate::functions::RESULT_LARGE_ERR_INFO,
|
||||||
crate::functions::RESULT_UNIT_ERR_INFO,
|
crate::functions::RESULT_UNIT_ERR_INFO,
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
mod misnamed_getters;
|
mod misnamed_getters;
|
||||||
mod must_use;
|
mod must_use;
|
||||||
mod not_unsafe_ptr_arg_deref;
|
mod not_unsafe_ptr_arg_deref;
|
||||||
|
mod ref_option;
|
||||||
mod renamed_function_params;
|
mod renamed_function_params;
|
||||||
mod result;
|
mod result;
|
||||||
mod too_many_arguments;
|
mod too_many_arguments;
|
||||||
@ -399,6 +400,50 @@
|
|||||||
"renamed function parameters in trait implementation"
|
"renamed function parameters in trait implementation"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare_clippy_lint! {
|
||||||
|
/// ### What it does
|
||||||
|
/// Warns when a function signature uses `&Option<T>` instead of `Option<&T>`.
|
||||||
|
///
|
||||||
|
/// ### Why is this bad?
|
||||||
|
/// More flexibility, better memory optimization, and more idiomatic Rust code.
|
||||||
|
///
|
||||||
|
/// `&Option<T>` in a function signature breaks encapsulation because the caller must own T
|
||||||
|
/// and move it into an Option to call with it. When returned, the owner must internally store
|
||||||
|
/// it as `Option<T>` in order to return it.
|
||||||
|
/// At a lower level `&Option<T>` points to memory that has `presence` bit flag + value,
|
||||||
|
/// whereas `Option<&T>` is always optimized to a single pointer.
|
||||||
|
///
|
||||||
|
/// See this [YouTube video](https://www.youtube.com/watch?v=6c7pZYP_iIE) by
|
||||||
|
/// Logan Smith for an in-depth explanation of why this is important.
|
||||||
|
///
|
||||||
|
/// ### Known problems
|
||||||
|
/// This lint recommends changing the function signatures, but it cannot
|
||||||
|
/// automatically change the function calls or the function implementations.
|
||||||
|
///
|
||||||
|
/// ### Example
|
||||||
|
/// ```no_run
|
||||||
|
/// // caller uses foo(&opt)
|
||||||
|
/// fn foo(a: &Option<String>) {}
|
||||||
|
/// # struct Unit {}
|
||||||
|
/// # impl Unit {
|
||||||
|
/// fn bar(&self) -> &Option<String> { &None }
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
/// Use instead:
|
||||||
|
/// ```no_run
|
||||||
|
/// // caller should use foo(opt.as_ref())
|
||||||
|
/// fn foo(a: Option<&String>) {}
|
||||||
|
/// # struct Unit {}
|
||||||
|
/// # impl Unit {
|
||||||
|
/// fn bar(&self) -> Option<&String> { None }
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
#[clippy::version = "1.82.0"]
|
||||||
|
pub REF_OPTION,
|
||||||
|
nursery,
|
||||||
|
"function signature uses `&Option<T>` instead of `Option<&T>`"
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Functions {
|
pub struct Functions {
|
||||||
too_many_arguments_threshold: u64,
|
too_many_arguments_threshold: u64,
|
||||||
too_many_lines_threshold: u64,
|
too_many_lines_threshold: u64,
|
||||||
@ -437,6 +482,7 @@ pub fn new(tcx: TyCtxt<'_>, conf: &'static Conf) -> Self {
|
|||||||
MISNAMED_GETTERS,
|
MISNAMED_GETTERS,
|
||||||
IMPL_TRAIT_IN_PARAMS,
|
IMPL_TRAIT_IN_PARAMS,
|
||||||
RENAMED_FUNCTION_PARAMS,
|
RENAMED_FUNCTION_PARAMS,
|
||||||
|
REF_OPTION,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
impl<'tcx> LateLintPass<'tcx> for Functions {
|
impl<'tcx> LateLintPass<'tcx> for Functions {
|
||||||
@ -455,6 +501,16 @@ fn check_fn(
|
|||||||
not_unsafe_ptr_arg_deref::check_fn(cx, kind, decl, body, def_id);
|
not_unsafe_ptr_arg_deref::check_fn(cx, kind, decl, body, def_id);
|
||||||
misnamed_getters::check_fn(cx, kind, decl, body, span);
|
misnamed_getters::check_fn(cx, kind, decl, body, span);
|
||||||
impl_trait_in_params::check_fn(cx, &kind, body, hir_id);
|
impl_trait_in_params::check_fn(cx, &kind, body, hir_id);
|
||||||
|
ref_option::check_fn(
|
||||||
|
cx,
|
||||||
|
kind,
|
||||||
|
decl,
|
||||||
|
span,
|
||||||
|
hir_id,
|
||||||
|
def_id,
|
||||||
|
body,
|
||||||
|
self.avoid_breaking_exported_api,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
|
||||||
@ -475,5 +531,6 @@ fn check_trait_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::TraitIte
|
|||||||
must_use::check_trait_item(cx, item);
|
must_use::check_trait_item(cx, item);
|
||||||
result::check_trait_item(cx, item, self.large_error_threshold);
|
result::check_trait_item(cx, item, self.large_error_threshold);
|
||||||
impl_trait_in_params::check_trait_item(cx, item, self.avoid_breaking_exported_api);
|
impl_trait_in_params::check_trait_item(cx, item, self.avoid_breaking_exported_api);
|
||||||
|
ref_option::check_trait_item(cx, item, self.avoid_breaking_exported_api);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
122
clippy_lints/src/functions/ref_option.rs
Normal file
122
clippy_lints/src/functions/ref_option.rs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
use crate::functions::REF_OPTION;
|
||||||
|
use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
|
use clippy_utils::is_trait_impl_item;
|
||||||
|
use clippy_utils::source::snippet;
|
||||||
|
use clippy_utils::ty::is_type_diagnostic_item;
|
||||||
|
use rustc_errors::Applicability;
|
||||||
|
use rustc_hir as hir;
|
||||||
|
use rustc_hir::intravisit::FnKind;
|
||||||
|
use rustc_hir::{FnDecl, HirId};
|
||||||
|
use rustc_lint::LateContext;
|
||||||
|
use rustc_middle::ty::{self, GenericArgKind, Mutability, Ty};
|
||||||
|
use rustc_span::def_id::LocalDefId;
|
||||||
|
use rustc_span::{Span, sym};
|
||||||
|
|
||||||
|
fn check_ty<'a>(cx: &LateContext<'a>, param: &rustc_hir::Ty<'a>, param_ty: Ty<'a>, fixes: &mut Vec<(Span, String)>) {
|
||||||
|
if let ty::Ref(_, opt_ty, Mutability::Not) = param_ty.kind()
|
||||||
|
&& is_type_diagnostic_item(cx, *opt_ty, sym::Option)
|
||||||
|
&& let ty::Adt(_, opt_gen) = opt_ty.kind()
|
||||||
|
&& let [gen] = opt_gen.as_slice()
|
||||||
|
&& let GenericArgKind::Type(gen_ty) = gen.unpack()
|
||||||
|
&& !gen_ty.is_ref()
|
||||||
|
// Need to gen the original spans, so first parsing mid, and hir parsing afterward
|
||||||
|
&& let hir::TyKind::Ref(lifetime, hir::MutTy { ty, .. }) = param.kind
|
||||||
|
&& let hir::TyKind::Path(hir::QPath::Resolved(_, path)) = ty.kind
|
||||||
|
&& let (Some(first), Some(last)) = (path.segments.first(), path.segments.last())
|
||||||
|
&& let Some(hir::GenericArgs {
|
||||||
|
args: [hir::GenericArg::Type(opt_ty)],
|
||||||
|
..
|
||||||
|
}) = last.args
|
||||||
|
{
|
||||||
|
let lifetime = snippet(cx, lifetime.ident.span, "..");
|
||||||
|
fixes.push((
|
||||||
|
param.span,
|
||||||
|
format!(
|
||||||
|
"{}<&{lifetime}{}{}>",
|
||||||
|
snippet(cx, first.ident.span.to(last.ident.span), ".."),
|
||||||
|
if lifetime.is_empty() { "" } else { " " },
|
||||||
|
snippet(cx, opt_ty.span, "..")
|
||||||
|
),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_fn_sig<'a>(cx: &LateContext<'a>, decl: &FnDecl<'a>, span: Span, sig: ty::FnSig<'a>) {
|
||||||
|
let mut fixes = Vec::new();
|
||||||
|
// Check function arguments' types
|
||||||
|
for (param, param_ty) in decl.inputs.iter().zip(sig.inputs()) {
|
||||||
|
check_ty(cx, param, *param_ty, &mut fixes);
|
||||||
|
}
|
||||||
|
// Check return type
|
||||||
|
if let hir::FnRetTy::Return(ty) = &decl.output {
|
||||||
|
check_ty(cx, ty, sig.output(), &mut fixes);
|
||||||
|
}
|
||||||
|
if !fixes.is_empty() {
|
||||||
|
span_lint_and_then(
|
||||||
|
cx,
|
||||||
|
REF_OPTION,
|
||||||
|
span,
|
||||||
|
"it is more idiomatic to use `Option<&T>` instead of `&Option<T>`",
|
||||||
|
|diag| {
|
||||||
|
diag.multipart_suggestion("change this to", fixes, Applicability::Unspecified);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)]
|
||||||
|
pub(crate) fn check_fn<'a>(
|
||||||
|
cx: &LateContext<'a>,
|
||||||
|
kind: FnKind<'_>,
|
||||||
|
decl: &FnDecl<'a>,
|
||||||
|
span: Span,
|
||||||
|
hir_id: HirId,
|
||||||
|
def_id: LocalDefId,
|
||||||
|
body: &hir::Body<'_>,
|
||||||
|
avoid_breaking_exported_api: bool,
|
||||||
|
) {
|
||||||
|
if avoid_breaking_exported_api && cx.effective_visibilities.is_exported(def_id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let FnKind::Closure = kind {
|
||||||
|
// Compute the span of the closure parameters + return type if set
|
||||||
|
let span = if let hir::FnRetTy::Return(out_ty) = &decl.output {
|
||||||
|
if decl.inputs.is_empty() {
|
||||||
|
out_ty.span
|
||||||
|
} else {
|
||||||
|
span.with_hi(out_ty.span.hi())
|
||||||
|
}
|
||||||
|
} else if let (Some(first), Some(last)) = (decl.inputs.first(), decl.inputs.last()) {
|
||||||
|
first.span.to(last.span)
|
||||||
|
} else {
|
||||||
|
// No parameters - no point in checking
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Figure out the signature of the closure
|
||||||
|
let ty::Closure(_, args) = cx.typeck_results().expr_ty(body.value).kind() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let sig = args.as_closure().sig().skip_binder();
|
||||||
|
|
||||||
|
check_fn_sig(cx, decl, span, sig);
|
||||||
|
} else if !is_trait_impl_item(cx, hir_id) {
|
||||||
|
let sig = cx.tcx.fn_sig(def_id).instantiate_identity().skip_binder();
|
||||||
|
check_fn_sig(cx, decl, span, sig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn check_trait_item<'a>(
|
||||||
|
cx: &LateContext<'a>,
|
||||||
|
trait_item: &hir::TraitItem<'a>,
|
||||||
|
avoid_breaking_exported_api: bool,
|
||||||
|
) {
|
||||||
|
if let hir::TraitItemKind::Fn(ref sig, _) = trait_item.kind
|
||||||
|
&& !(avoid_breaking_exported_api && cx.effective_visibilities.is_exported(trait_item.owner_id.def_id))
|
||||||
|
{
|
||||||
|
let def_id = trait_item.owner_id.def_id;
|
||||||
|
let ty_sig = cx.tcx.fn_sig(def_id).instantiate_identity().skip_binder();
|
||||||
|
check_fn_sig(cx, sig.decl, sig.span, ty_sig);
|
||||||
|
}
|
||||||
|
}
|
1
tests/ui/ref_option/all/clippy.toml
Normal file
1
tests/ui/ref_option/all/clippy.toml
Normal file
@ -0,0 +1 @@
|
|||||||
|
avoid-breaking-exported-api = false
|
1
tests/ui/ref_option/private/clippy.toml
Normal file
1
tests/ui/ref_option/private/clippy.toml
Normal file
@ -0,0 +1 @@
|
|||||||
|
avoid-breaking-exported-api = true
|
62
tests/ui/ref_option/ref_option.all.fixed
Normal file
62
tests/ui/ref_option/ref_option.all.fixed
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
//@revisions: private all
|
||||||
|
//@[private] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/private
|
||||||
|
//@[all] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/all
|
||||||
|
|
||||||
|
#![allow(unused, clippy::needless_lifetimes, clippy::borrowed_box)]
|
||||||
|
#![warn(clippy::ref_option)]
|
||||||
|
|
||||||
|
fn opt_u8(a: Option<&u8>) {}
|
||||||
|
fn opt_gen<T>(a: Option<&T>) {}
|
||||||
|
fn opt_string(a: std::option::Option<&String>) {}
|
||||||
|
fn ret_string<'a>(p: &'a str) -> Option<&'a u8> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
fn ret_string_static() -> Option<&'static u8> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
fn mult_string(a: Option<&String>, b: Option<&Vec<u8>>) {}
|
||||||
|
fn ret_box<'a>() -> Option<&'a Box<u8>> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pub_opt_string(a: Option<&String>) {}
|
||||||
|
pub fn pub_mult_string(a: Option<&String>, b: Option<&Vec<u8>>) {}
|
||||||
|
|
||||||
|
pub trait PubTrait {
|
||||||
|
fn pub_trait_opt(&self, a: Option<&Vec<u8>>);
|
||||||
|
fn pub_trait_ret(&self) -> Option<&Vec<u8>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PrivateTrait {
|
||||||
|
fn trait_opt(&self, a: Option<&String>);
|
||||||
|
fn trait_ret(&self) -> Option<&String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PubStruct;
|
||||||
|
|
||||||
|
impl PubStruct {
|
||||||
|
pub fn pub_opt_params(&self, a: Option<&()>) {}
|
||||||
|
pub fn pub_opt_ret(&self) -> Option<&String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn private_opt_params(&self, a: Option<&()>) {}
|
||||||
|
fn private_opt_ret(&self) -> Option<&String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// valid, don't change
|
||||||
|
fn mut_u8(a: &mut Option<u8>) {}
|
||||||
|
pub fn pub_mut_u8(a: &mut Option<String>) {}
|
||||||
|
|
||||||
|
// might be good to catch in the future
|
||||||
|
fn mut_u8_ref(a: &mut &Option<u8>) {}
|
||||||
|
pub fn pub_mut_u8_ref(a: &mut &Option<String>) {}
|
||||||
|
fn lambdas() {
|
||||||
|
// Not handled for now, not sure if we should
|
||||||
|
let x = |a: &Option<String>| {};
|
||||||
|
let x = |a: &Option<String>| -> &Option<String> { panic!() };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
162
tests/ui/ref_option/ref_option.all.stderr
Normal file
162
tests/ui/ref_option/ref_option.all.stderr
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:8:1
|
||||||
|
|
|
||||||
|
LL | fn opt_u8(a: &Option<u8>) {}
|
||||||
|
| ^^^^^^^^^^^^^-----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&u8>`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::ref-option` implied by `-D warnings`
|
||||||
|
= help: to override `-D warnings` add `#[allow(clippy::ref_option)]`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:9:1
|
||||||
|
|
|
||||||
|
LL | fn opt_gen<T>(a: &Option<T>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&T>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:10:1
|
||||||
|
|
|
||||||
|
LL | fn opt_string(a: &std::option::Option<String>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^----------------------------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `std::option::Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn ret_string<'a>(p: &'a str) -> &'a Option<u8> {
|
||||||
|
| ^ -------------- help: change this to: `Option<&'a u8>`
|
||||||
|
| _|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:14:1
|
||||||
|
|
|
||||||
|
LL | fn ret_string_static() -> &'static Option<u8> {
|
||||||
|
| ^ ------------------- help: change this to: `Option<&'static u8>`
|
||||||
|
| _|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:17:1
|
||||||
|
|
|
||||||
|
LL | fn mult_string(a: &Option<String>, b: &Option<Vec<u8>>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: change this to
|
||||||
|
|
|
||||||
|
LL | fn mult_string(a: Option<&String>, b: Option<&Vec<u8>>) {}
|
||||||
|
| ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:18:1
|
||||||
|
|
|
||||||
|
LL | fn ret_box<'a>() -> &'a Option<Box<u8>> {
|
||||||
|
| ^ ------------------- help: change this to: `Option<&'a Box<u8>>`
|
||||||
|
| _|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:22:1
|
||||||
|
|
|
||||||
|
LL | pub fn pub_opt_string(a: &Option<String>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^---------------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:23:1
|
||||||
|
|
|
||||||
|
LL | pub fn pub_mult_string(a: &Option<String>, b: &Option<Vec<u8>>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: change this to
|
||||||
|
|
|
||||||
|
LL | pub fn pub_mult_string(a: Option<&String>, b: Option<&Vec<u8>>) {}
|
||||||
|
| ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:26:5
|
||||||
|
|
|
||||||
|
LL | fn pub_trait_opt(&self, a: &Option<Vec<u8>>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&Vec<u8>>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:27:5
|
||||||
|
|
|
||||||
|
LL | fn pub_trait_ret(&self) -> &Option<Vec<u8>>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&Vec<u8>>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:31:5
|
||||||
|
|
|
||||||
|
LL | fn trait_opt(&self, a: &Option<String>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:32:5
|
||||||
|
|
|
||||||
|
LL | fn trait_ret(&self) -> &Option<String>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:38:5
|
||||||
|
|
|
||||||
|
LL | pub fn pub_opt_params(&self, a: &Option<()>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&()>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:39:5
|
||||||
|
|
|
||||||
|
LL | pub fn pub_opt_ret(&self) -> &Option<String> {
|
||||||
|
| ^ --------------- help: change this to: `Option<&String>`
|
||||||
|
| _____|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_____^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:43:5
|
||||||
|
|
|
||||||
|
LL | fn private_opt_params(&self, a: &Option<()>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&()>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:44:5
|
||||||
|
|
|
||||||
|
LL | fn private_opt_ret(&self) -> &Option<String> {
|
||||||
|
| ^ --------------- help: change this to: `Option<&String>`
|
||||||
|
| _____|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_____^
|
||||||
|
|
||||||
|
error: aborting due to 17 previous errors
|
||||||
|
|
62
tests/ui/ref_option/ref_option.private.fixed
Normal file
62
tests/ui/ref_option/ref_option.private.fixed
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
//@revisions: private all
|
||||||
|
//@[private] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/private
|
||||||
|
//@[all] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/all
|
||||||
|
|
||||||
|
#![allow(unused, clippy::needless_lifetimes, clippy::borrowed_box)]
|
||||||
|
#![warn(clippy::ref_option)]
|
||||||
|
|
||||||
|
fn opt_u8(a: Option<&u8>) {}
|
||||||
|
fn opt_gen<T>(a: Option<&T>) {}
|
||||||
|
fn opt_string(a: std::option::Option<&String>) {}
|
||||||
|
fn ret_string<'a>(p: &'a str) -> Option<&'a u8> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
fn ret_string_static() -> Option<&'static u8> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
fn mult_string(a: Option<&String>, b: Option<&Vec<u8>>) {}
|
||||||
|
fn ret_box<'a>() -> Option<&'a Box<u8>> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pub_opt_string(a: &Option<String>) {}
|
||||||
|
pub fn pub_mult_string(a: &Option<String>, b: &Option<Vec<u8>>) {}
|
||||||
|
|
||||||
|
pub trait PubTrait {
|
||||||
|
fn pub_trait_opt(&self, a: &Option<Vec<u8>>);
|
||||||
|
fn pub_trait_ret(&self) -> &Option<Vec<u8>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PrivateTrait {
|
||||||
|
fn trait_opt(&self, a: Option<&String>);
|
||||||
|
fn trait_ret(&self) -> Option<&String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PubStruct;
|
||||||
|
|
||||||
|
impl PubStruct {
|
||||||
|
pub fn pub_opt_params(&self, a: &Option<()>) {}
|
||||||
|
pub fn pub_opt_ret(&self) -> &Option<String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn private_opt_params(&self, a: Option<&()>) {}
|
||||||
|
fn private_opt_ret(&self) -> Option<&String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// valid, don't change
|
||||||
|
fn mut_u8(a: &mut Option<u8>) {}
|
||||||
|
pub fn pub_mut_u8(a: &mut Option<String>) {}
|
||||||
|
|
||||||
|
// might be good to catch in the future
|
||||||
|
fn mut_u8_ref(a: &mut &Option<u8>) {}
|
||||||
|
pub fn pub_mut_u8_ref(a: &mut &Option<String>) {}
|
||||||
|
fn lambdas() {
|
||||||
|
// Not handled for now, not sure if we should
|
||||||
|
let x = |a: &Option<String>| {};
|
||||||
|
let x = |a: &Option<String>| -> &Option<String> { panic!() };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
108
tests/ui/ref_option/ref_option.private.stderr
Normal file
108
tests/ui/ref_option/ref_option.private.stderr
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:8:1
|
||||||
|
|
|
||||||
|
LL | fn opt_u8(a: &Option<u8>) {}
|
||||||
|
| ^^^^^^^^^^^^^-----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&u8>`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::ref-option` implied by `-D warnings`
|
||||||
|
= help: to override `-D warnings` add `#[allow(clippy::ref_option)]`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:9:1
|
||||||
|
|
|
||||||
|
LL | fn opt_gen<T>(a: &Option<T>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&T>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:10:1
|
||||||
|
|
|
||||||
|
LL | fn opt_string(a: &std::option::Option<String>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^----------------------------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `std::option::Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:11:1
|
||||||
|
|
|
||||||
|
LL | fn ret_string<'a>(p: &'a str) -> &'a Option<u8> {
|
||||||
|
| ^ -------------- help: change this to: `Option<&'a u8>`
|
||||||
|
| _|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:14:1
|
||||||
|
|
|
||||||
|
LL | fn ret_string_static() -> &'static Option<u8> {
|
||||||
|
| ^ ------------------- help: change this to: `Option<&'static u8>`
|
||||||
|
| _|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:17:1
|
||||||
|
|
|
||||||
|
LL | fn mult_string(a: &Option<String>, b: &Option<Vec<u8>>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
help: change this to
|
||||||
|
|
|
||||||
|
LL | fn mult_string(a: Option<&String>, b: Option<&Vec<u8>>) {}
|
||||||
|
| ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:18:1
|
||||||
|
|
|
||||||
|
LL | fn ret_box<'a>() -> &'a Option<Box<u8>> {
|
||||||
|
| ^ ------------------- help: change this to: `Option<&'a Box<u8>>`
|
||||||
|
| _|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:31:5
|
||||||
|
|
|
||||||
|
LL | fn trait_opt(&self, a: &Option<String>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:32:5
|
||||||
|
|
|
||||||
|
LL | fn trait_ret(&self) -> &Option<String>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:43:5
|
||||||
|
|
|
||||||
|
LL | fn private_opt_params(&self, a: &Option<()>) {}
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-----------^^^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&()>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option.rs:44:5
|
||||||
|
|
|
||||||
|
LL | fn private_opt_ret(&self) -> &Option<String> {
|
||||||
|
| ^ --------------- help: change this to: `Option<&String>`
|
||||||
|
| _____|
|
||||||
|
| |
|
||||||
|
LL | | panic!()
|
||||||
|
LL | | }
|
||||||
|
| |_____^
|
||||||
|
|
||||||
|
error: aborting due to 11 previous errors
|
||||||
|
|
62
tests/ui/ref_option/ref_option.rs
Normal file
62
tests/ui/ref_option/ref_option.rs
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
//@revisions: private all
|
||||||
|
//@[private] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/private
|
||||||
|
//@[all] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/all
|
||||||
|
|
||||||
|
#![allow(unused, clippy::needless_lifetimes, clippy::borrowed_box)]
|
||||||
|
#![warn(clippy::ref_option)]
|
||||||
|
|
||||||
|
fn opt_u8(a: &Option<u8>) {}
|
||||||
|
fn opt_gen<T>(a: &Option<T>) {}
|
||||||
|
fn opt_string(a: &std::option::Option<String>) {}
|
||||||
|
fn ret_string<'a>(p: &'a str) -> &'a Option<u8> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
fn ret_string_static() -> &'static Option<u8> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
fn mult_string(a: &Option<String>, b: &Option<Vec<u8>>) {}
|
||||||
|
fn ret_box<'a>() -> &'a Option<Box<u8>> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn pub_opt_string(a: &Option<String>) {}
|
||||||
|
pub fn pub_mult_string(a: &Option<String>, b: &Option<Vec<u8>>) {}
|
||||||
|
|
||||||
|
pub trait PubTrait {
|
||||||
|
fn pub_trait_opt(&self, a: &Option<Vec<u8>>);
|
||||||
|
fn pub_trait_ret(&self) -> &Option<Vec<u8>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PrivateTrait {
|
||||||
|
fn trait_opt(&self, a: &Option<String>);
|
||||||
|
fn trait_ret(&self) -> &Option<String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PubStruct;
|
||||||
|
|
||||||
|
impl PubStruct {
|
||||||
|
pub fn pub_opt_params(&self, a: &Option<()>) {}
|
||||||
|
pub fn pub_opt_ret(&self) -> &Option<String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn private_opt_params(&self, a: &Option<()>) {}
|
||||||
|
fn private_opt_ret(&self) -> &Option<String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// valid, don't change
|
||||||
|
fn mut_u8(a: &mut Option<u8>) {}
|
||||||
|
pub fn pub_mut_u8(a: &mut Option<String>) {}
|
||||||
|
|
||||||
|
// might be good to catch in the future
|
||||||
|
fn mut_u8_ref(a: &mut &Option<u8>) {}
|
||||||
|
pub fn pub_mut_u8_ref(a: &mut &Option<String>) {}
|
||||||
|
fn lambdas() {
|
||||||
|
// Not handled for now, not sure if we should
|
||||||
|
let x = |a: &Option<String>| {};
|
||||||
|
let x = |a: &Option<String>| -> &Option<String> { panic!() };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
37
tests/ui/ref_option/ref_option_traits.all.stderr
Normal file
37
tests/ui/ref_option/ref_option_traits.all.stderr
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option_traits.rs:10:5
|
||||||
|
|
|
||||||
|
LL | fn pub_trait_opt(&self, a: &Option<Vec<u8>>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&Vec<u8>>`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::ref-option` implied by `-D warnings`
|
||||||
|
= help: to override `-D warnings` add `#[allow(clippy::ref_option)]`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option_traits.rs:11:5
|
||||||
|
|
|
||||||
|
LL | fn pub_trait_ret(&self) -> &Option<Vec<u8>>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^----------------^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&Vec<u8>>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option_traits.rs:15:5
|
||||||
|
|
|
||||||
|
LL | fn trait_opt(&self, a: &Option<String>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option_traits.rs:16:5
|
||||||
|
|
|
||||||
|
LL | fn trait_ret(&self) -> &Option<String>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: aborting due to 4 previous errors
|
||||||
|
|
21
tests/ui/ref_option/ref_option_traits.private.stderr
Normal file
21
tests/ui/ref_option/ref_option_traits.private.stderr
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option_traits.rs:15:5
|
||||||
|
|
|
||||||
|
LL | fn trait_opt(&self, a: &Option<String>);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::ref-option` implied by `-D warnings`
|
||||||
|
= help: to override `-D warnings` add `#[allow(clippy::ref_option)]`
|
||||||
|
|
||||||
|
error: it is more idiomatic to use `Option<&T>` instead of `&Option<T>`
|
||||||
|
--> tests/ui/ref_option/ref_option_traits.rs:16:5
|
||||||
|
|
|
||||||
|
LL | fn trait_ret(&self) -> &Option<String>;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^---------------^
|
||||||
|
| |
|
||||||
|
| help: change this to: `Option<&String>`
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
37
tests/ui/ref_option/ref_option_traits.rs
Normal file
37
tests/ui/ref_option/ref_option_traits.rs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
//@no-rustfix: fixes are only done to traits, not the impls
|
||||||
|
//@revisions: private all
|
||||||
|
//@[private] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/private
|
||||||
|
//@[all] rustc-env:CLIPPY_CONF_DIR=tests/ui/ref_option/all
|
||||||
|
|
||||||
|
#![allow(unused, clippy::all)]
|
||||||
|
#![warn(clippy::ref_option)]
|
||||||
|
|
||||||
|
pub trait PubTrait {
|
||||||
|
fn pub_trait_opt(&self, a: &Option<Vec<u8>>);
|
||||||
|
fn pub_trait_ret(&self) -> &Option<Vec<u8>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait PrivateTrait {
|
||||||
|
fn trait_opt(&self, a: &Option<String>);
|
||||||
|
fn trait_ret(&self) -> &Option<String>;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct PubStruct;
|
||||||
|
|
||||||
|
impl PubTrait for PubStruct {
|
||||||
|
fn pub_trait_opt(&self, a: &Option<Vec<u8>>) {}
|
||||||
|
fn pub_trait_ret(&self) -> &Option<Vec<u8>> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct PrivateStruct;
|
||||||
|
|
||||||
|
impl PrivateTrait for PrivateStruct {
|
||||||
|
fn trait_opt(&self, a: &Option<String>) {}
|
||||||
|
fn trait_ret(&self) -> &Option<String> {
|
||||||
|
panic!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
Loading…
Reference in New Issue
Block a user