2 #![warn(clippy::or_fun_call)]
6 clippy
::uninlined_format_args
,
7 clippy
::unnecessary_wraps
,
8 clippy
::unnecessary_literal_unwrap
,
12 use std
::collections
::{BTreeMap, HashMap}
;
13 use std
::time
::Duration
;
15 /// Checks implementation of the `OR_FUN_CALL` lint.
27 fn default() -> Self {
32 impl Default
for FakeDefault
{
33 fn default() -> Self {
46 let with_enum
= Some(Enum
::A(1));
47 with_enum
.unwrap_or(Enum
::A(5));
49 let with_const_fn
= Some(Duration
::from_secs(1));
50 with_const_fn
.unwrap_or(Duration
::from_secs(5));
52 let with_constructor
= Some(vec
![1]);
53 with_constructor
.unwrap_or(make());
55 let with_new
= Some(vec
![1]);
56 with_new
.unwrap_or(Vec
::new());
58 let with_const_args
= Some(vec
![1]);
59 with_const_args
.unwrap_or(Vec
::with_capacity(12));
61 let with_err
: Result
<_
, ()> = Ok(vec
![1]);
62 with_err
.unwrap_or(make());
64 let with_err_args
: Result
<_
, ()> = Ok(vec
![1]);
65 with_err_args
.unwrap_or(Vec
::with_capacity(12));
67 let with_default_trait
= Some(1);
68 with_default_trait
.unwrap_or(Default
::default());
70 let with_default_type
= Some(1);
71 with_default_type
.unwrap_or(u64::default());
73 let self_default
= None
::<FakeDefault
>;
74 self_default
.unwrap_or(<FakeDefault
>::default());
76 let real_default
= None
::<FakeDefault
>;
77 real_default
.unwrap_or(<FakeDefault
as Default
>::default());
79 let with_vec
= Some(vec
![1]);
80 with_vec
.unwrap_or(vec
![]);
82 let without_default
= Some(Foo
);
83 without_default
.unwrap_or(Foo
::new());
85 let mut map
= HashMap
::<u64, String
>::new();
86 map
.entry(42).or_insert(String
::new());
88 let mut map_vec
= HashMap
::<u64, Vec
<i32>>::new();
89 map_vec
.entry(42).or_insert(vec
![]);
91 let mut btree
= BTreeMap
::<u64, String
>::new();
92 btree
.entry(42).or_insert(String
::new());
94 let mut btree_vec
= BTreeMap
::<u64, Vec
<i32>>::new();
95 btree_vec
.entry(42).or_insert(vec
![]);
97 let stringy
= Some(String
::new());
98 let _
= stringy
.unwrap_or(String
::new());
102 let _
= opt
.ok_or(format
!("{} world.", hello
));
105 let map
= HashMap
::<u64, u64>::new();
106 let _
= Some(1).unwrap_or(map
[&1]);
107 let map
= BTreeMap
::<u64, u64>::new();
108 let _
= Some(1).unwrap_or(map
[&1]);
109 // don't lint index vec
111 let _
= Some(1).unwrap_or(vec
[1]);
115 struct Bar(String
, Duration
);
117 fn test_or_with_ctors() {
119 let opt_opt
= Some(Some(1));
120 // we also test for const promotion, this makes sure we don't hit that
123 let _
= opt_opt
.unwrap_or(Some(2));
124 let _
= opt_opt
.unwrap_or(Some(two
));
125 let _
= opt
.ok_or(Some(2));
126 let _
= opt
.ok_or(Some(two
));
127 let _
= opt
.ok_or(Foo(2));
128 let _
= opt
.ok_or(Foo(two
));
129 let _
= opt
.or(Some(2));
130 let _
= opt
.or(Some(two
));
132 let _
= Some("a".to_string()).or(Some("b".to_string()));
134 let b
= "b".to_string();
135 let _
= Some(Bar("a".to_string(), Duration
::from_secs(1)))
136 .or(Some(Bar(b
, Duration
::from_secs(2))));
138 let vec
= vec
!["foo"];
139 let _
= opt
.ok_or(vec
.len());
142 let _
= opt
.ok_or(array
.len());
144 let slice
= &["foo"][..];
145 let _
= opt
.ok_or(slice
.len());
148 let _
= opt
.ok_or(string
.len());
151 // Issue 4514 - early return
152 fn f() -> Option
<()> {
156 let _
= a
.unwrap_or(b
.checked_mul(3)?
.min(240));
162 unsafe fn ptr_to_ref
<'a
, T
>(p
: *const T
) -> &'a T
{
164 let x
= vec
![0; 1000]; // future-proofing, make this function expensive.
169 let s
= "test".to_owned();
170 let s
= &s
as *const _
;
171 None
.unwrap_or(ptr_to_ref(s
));
175 let s
= "test".to_owned();
176 let s
= &s
as *const _
;
177 None
.unwrap_or(unsafe { ptr_to_ref(s) }
);
179 None
.unwrap_or( unsafe { ptr_to_ref(s) }
);
184 fn more_than_max_suggestion_highest_lines_0() {
185 let frames
= Vec
::new();
188 .map(|f
: &String
| f
.to_lowercase())
189 .reduce(|mut acc
, f
| {
193 .unwrap_or(String
::new());
196 fn more_to_max_suggestion_highest_lines_1() {
197 let frames
= Vec
::new();
198 let iter
= frames
.iter();
199 iter
.map(|f
: &String
| f
.to_lowercase())
200 .reduce(|mut acc
, f
| {
206 .unwrap_or(String
::new());
209 fn equal_to_max_suggestion_highest_lines() {
210 let frames
= Vec
::new();
211 let iter
= frames
.iter();
212 iter
.map(|f
: &String
| f
.to_lowercase())
213 .reduce(|mut acc
, f
| {
218 .unwrap_or(String
::new());
221 fn less_than_max_suggestion_highest_lines() {
222 let frames
= Vec
::new();
223 let iter
= frames
.iter();
224 let map
= iter
.map(|f
: &String
| f
.to_lowercase());
225 map
.reduce(|mut acc
, f
| {
229 .unwrap_or(String
::new());
240 let _
= None
.unwrap_or(X
::Y(0));
249 fn f(n
: i32) -> i32 {
254 let _
= Some(4).map_or(g(), |v
| v
);
255 let _
= Some(4).map_or(g(), f
);
256 let _
= Some(4).map_or(0, f
);
274 fn default() -> Self {
279 impl Default
for FakeDefault
{
280 fn default() -> Self {
285 let with_new
= Some(vec
![1]);
286 with_new
.unwrap_or_else(Vec
::new
);
288 let with_default_trait
= Some(1);
289 with_default_trait
.unwrap_or_else(Default
::default);
291 let with_default_type
= Some(1);
292 with_default_type
.unwrap_or_else(u64::default);
294 let real_default
= None
::<FakeDefault
>;
295 real_default
.unwrap_or_else(<FakeDefault
as Default
>::default);
297 let mut map
= HashMap
::<u64, String
>::new();
298 map
.entry(42).or_insert_with(String
::new
);
300 let mut btree
= BTreeMap
::<u64, String
>::new();
301 btree
.entry(42).or_insert_with(String
::new
);
303 let stringy
= Some(String
::new());
304 let _
= stringy
.unwrap_or_else(String
::new
);
307 let self_default
= None
::<FakeDefault
>;
308 self_default
.unwrap_or_else(<FakeDefault
>::default);
310 let without_default
= Some(Foo
);
311 without_default
.unwrap_or_else(Foo
::new
);