summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/tests/ui/redundant_allocation.rs
blob: cf7d8c6e349af2c685037126830a6bf0ac2eb029 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#![warn(clippy::all)]
#![allow(clippy::boxed_local, clippy::needless_pass_by_value)]
#![allow(clippy::blacklisted_name, unused_variables, dead_code)]
#![allow(unused_imports)]

pub struct MyStruct;

pub struct SubT<T> {
    foo: T,
}

pub enum MyEnum {
    One,
    Two,
}

mod outer_box {
    use crate::MyEnum;
    use crate::MyStruct;
    use crate::SubT;
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub fn box_test6<T>(foo: Box<Rc<T>>) {}

    pub fn box_test7<T>(foo: Box<Arc<T>>) {}

    pub fn box_test8() -> Box<Rc<SubT<usize>>> {
        unimplemented!();
    }

    pub fn box_test9<T>(foo: Box<Arc<T>>) -> Box<Arc<SubT<T>>> {
        unimplemented!();
    }
}

mod outer_rc {
    use crate::MyEnum;
    use crate::MyStruct;
    use crate::SubT;
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub fn rc_test5(a: Rc<Box<bool>>) {}

    pub fn rc_test7(a: Rc<Arc<bool>>) {}

    pub fn rc_test8() -> Rc<Box<SubT<usize>>> {
        unimplemented!();
    }

    pub fn rc_test9<T>(foo: Rc<Arc<T>>) -> Rc<Arc<SubT<T>>> {
        unimplemented!();
    }
}

mod outer_arc {
    use crate::MyEnum;
    use crate::MyStruct;
    use crate::SubT;
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub fn arc_test5(a: Arc<Box<bool>>) {}

    pub fn arc_test6(a: Arc<Rc<bool>>) {}

    pub fn arc_test8() -> Arc<Box<SubT<usize>>> {
        unimplemented!();
    }

    pub fn arc_test9<T>(foo: Arc<Rc<T>>) -> Arc<Rc<SubT<T>>> {
        unimplemented!();
    }
}

// https://github.com/rust-lang/rust-clippy/issues/7487
mod box_dyn {
    use std::boxed::Box;
    use std::rc::Rc;
    use std::sync::Arc;

    pub trait T {}

    struct S {
        a: Box<Box<dyn T>>,
        b: Rc<Box<dyn T>>,
        c: Arc<Box<dyn T>>,
    }

    pub fn test_box(_: Box<Box<dyn T>>) {}
    pub fn test_rc(_: Rc<Box<dyn T>>) {}
    pub fn test_arc(_: Arc<Box<dyn T>>) {}
    pub fn test_rc_box(_: Rc<Box<Box<dyn T>>>) {}
}

// https://github.com/rust-lang/rust-clippy/issues/8604
mod box_fat_ptr {
    use std::boxed::Box;
    use std::path::Path;
    use std::rc::Rc;
    use std::sync::Arc;

    pub struct DynSized {
        foo: [usize],
    }

    struct S {
        a: Box<Box<str>>,
        b: Rc<Box<str>>,
        c: Arc<Box<str>>,

        e: Box<Box<[usize]>>,
        f: Box<Box<Path>>,
        g: Box<Box<DynSized>>,
    }

    pub fn test_box_str(_: Box<Box<str>>) {}
    pub fn test_rc_str(_: Rc<Box<str>>) {}
    pub fn test_arc_str(_: Arc<Box<str>>) {}

    pub fn test_box_slice(_: Box<Box<[usize]>>) {}
    pub fn test_box_path(_: Box<Box<Path>>) {}
    pub fn test_box_custom(_: Box<Box<DynSized>>) {}

    pub fn test_rc_box_str(_: Rc<Box<Box<str>>>) {}
    pub fn test_rc_box_slice(_: Rc<Box<Box<[usize]>>>) {}
    pub fn test_rc_box_path(_: Rc<Box<Box<Path>>>) {}
    pub fn test_rc_box_custom(_: Rc<Box<Box<DynSized>>>) {}
}

fn main() {}