]> git.lizzy.rs Git - rust.git/blob - tests/ui/or_fun_call.rs
Auto merge of #4478 - tsurai:master, r=flip1995
[rust.git] / tests / ui / or_fun_call.rs
1 // run-rustfix
2
3 #![warn(clippy::or_fun_call)]
4 #![allow(dead_code)]
5
6 use std::collections::BTreeMap;
7 use std::collections::HashMap;
8 use std::time::Duration;
9
10 /// Checks implementation of the `OR_FUN_CALL` lint.
11 fn or_fun_call() {
12     struct Foo;
13
14     impl Foo {
15         fn new() -> Foo {
16             Foo
17         }
18     }
19
20     enum Enum {
21         A(i32),
22     }
23
24     fn make<T>() -> T {
25         unimplemented!();
26     }
27
28     let with_enum = Some(Enum::A(1));
29     with_enum.unwrap_or(Enum::A(5));
30
31     let with_const_fn = Some(Duration::from_secs(1));
32     with_const_fn.unwrap_or(Duration::from_secs(5));
33
34     let with_constructor = Some(vec![1]);
35     with_constructor.unwrap_or(make());
36
37     let with_new = Some(vec![1]);
38     with_new.unwrap_or(Vec::new());
39
40     let with_const_args = Some(vec![1]);
41     with_const_args.unwrap_or(Vec::with_capacity(12));
42
43     let with_err: Result<_, ()> = Ok(vec![1]);
44     with_err.unwrap_or(make());
45
46     let with_err_args: Result<_, ()> = Ok(vec![1]);
47     with_err_args.unwrap_or(Vec::with_capacity(12));
48
49     let with_default_trait = Some(1);
50     with_default_trait.unwrap_or(Default::default());
51
52     let with_default_type = Some(1);
53     with_default_type.unwrap_or(u64::default());
54
55     let with_vec = Some(vec![1]);
56     with_vec.unwrap_or(vec![]);
57
58     // FIXME #944: ~|SUGGESTION with_vec.unwrap_or_else(|| vec![]);
59
60     let without_default = Some(Foo);
61     without_default.unwrap_or(Foo::new());
62
63     let mut map = HashMap::<u64, String>::new();
64     map.entry(42).or_insert(String::new());
65
66     let mut btree = BTreeMap::<u64, String>::new();
67     btree.entry(42).or_insert(String::new());
68
69     let stringy = Some(String::from(""));
70     let _ = stringy.unwrap_or("".to_owned());
71
72     let opt = Some(1);
73     let hello = "Hello";
74     let _ = opt.ok_or(format!("{} world.", hello));
75 }
76
77 struct Foo(u8);
78 struct Bar(String, Duration);
79 #[rustfmt::skip]
80 fn test_or_with_ctors() {
81     let opt = Some(1);
82     let opt_opt = Some(Some(1));
83     // we also test for const promotion, this makes sure we don't hit that
84     let two = 2;
85
86     let _ = opt_opt.unwrap_or(Some(2));
87     let _ = opt_opt.unwrap_or(Some(two));
88     let _ = opt.ok_or(Some(2));
89     let _ = opt.ok_or(Some(two));
90     let _ = opt.ok_or(Foo(2));
91     let _ = opt.ok_or(Foo(two));
92     let _ = opt.or(Some(2));
93     let _ = opt.or(Some(two));
94
95     let _ = Some("a".to_string()).or(Some("b".to_string()));
96
97     let b = "b".to_string();
98     let _ = Some(Bar("a".to_string(), Duration::from_secs(1)))
99         .or(Some(Bar(b, Duration::from_secs(2))));
100 }
101
102 // Issue 4514 - early return
103 fn f() -> Option<()> {
104     let a = Some(1);
105     let b = 1i32;
106
107     let _ = a.unwrap_or(b.checked_mul(3)?.min(240));
108
109     Some(())
110 }
111
112 fn main() {}