summaryrefslogtreecommitdiffstats
path: root/src/test/ui/dep-graph/dep-graph-struct-signature.rs
blob: fcf9f6387102f64c2012b080b2882ef4f313a3b6 (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
// Test cases where a changing struct appears in the signature of fns
// and methods.

// incremental
// compile-flags: -Z query-dep-graph

#![feature(rustc_attrs)]
#![allow(dead_code)]
#![allow(unused_variables)]

fn main() { }

#[rustc_if_this_changed]
struct WillChange {
    x: u32,
    y: u32
}

struct WontChange {
    x: u32,
    y: u32
}

// these are valid dependencies
mod signatures {
    use WillChange;

    #[rustc_then_this_would_need(type_of)] //~ ERROR no path
    #[rustc_then_this_would_need(associated_item)] //~ ERROR no path
    #[rustc_then_this_would_need(trait_def)] //~ ERROR no path
    trait Bar {
        #[rustc_then_this_would_need(fn_sig)] //~ ERROR OK
        fn do_something(x: WillChange);
    }

    #[rustc_then_this_would_need(fn_sig)] //~ ERROR OK
    #[rustc_then_this_would_need(typeck)] //~ ERROR OK
    fn some_fn(x: WillChange) { }

    #[rustc_then_this_would_need(fn_sig)] //~ ERROR OK
    #[rustc_then_this_would_need(typeck)] //~ ERROR OK
    fn new_foo(x: u32, y: u32) -> WillChange {
        WillChange { x: x, y: y }
    }

    #[rustc_then_this_would_need(type_of)] //~ ERROR OK
    impl WillChange {
        #[rustc_then_this_would_need(fn_sig)] //~ ERROR OK
        #[rustc_then_this_would_need(typeck)] //~ ERROR OK
        fn new(x: u32, y: u32) -> WillChange { loop { } }
    }

    #[rustc_then_this_would_need(type_of)] //~ ERROR OK
    impl WillChange {
        #[rustc_then_this_would_need(fn_sig)] //~ ERROR OK
        #[rustc_then_this_would_need(typeck)] //~ ERROR OK
        fn method(&self, x: u32) { }
    }

    struct WillChanges {
        #[rustc_then_this_would_need(type_of)] //~ ERROR OK
        x: WillChange,
        #[rustc_then_this_would_need(type_of)] //~ ERROR OK
        y: WillChange
    }

    // The fields change, not the type itself.
    #[rustc_then_this_would_need(type_of)] //~ ERROR no path
    fn indirect(x: WillChanges) { }
}

mod invalid_signatures {
    use WontChange;

    #[rustc_then_this_would_need(type_of)] //~ ERROR no path
    trait A {
        #[rustc_then_this_would_need(fn_sig)] //~ ERROR no path
        fn do_something_else_twice(x: WontChange);
    }

    #[rustc_then_this_would_need(fn_sig)] //~ ERROR no path
    fn b(x: WontChange) { }

    #[rustc_then_this_would_need(fn_sig)] //~ ERROR no path from `WillChange`
    #[rustc_then_this_would_need(typeck)] //~ ERROR no path from `WillChange`
    fn c(x: u32) { }
}