]>
Commit | Line | Data |
---|---|---|
9cc50fc6 SL |
1 | // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
11 | // Test that when a trait impl changes, fns whose body uses that trait | |
12 | // must also be recompiled. | |
13 | ||
14 | // compile-flags: -Z incr-comp | |
15 | ||
16 | #![feature(rustc_attrs)] | |
17 | #![allow(warnings)] | |
18 | ||
19 | fn main() { } | |
20 | ||
21 | pub trait Foo: Sized { | |
22 | fn method(self) { } | |
23 | } | |
24 | ||
25 | mod x { | |
26 | use Foo; | |
27 | ||
28 | #[rustc_if_this_changed] | |
29 | impl Foo for char { } | |
30 | ||
31 | impl Foo for u32 { } | |
32 | } | |
33 | ||
34 | mod y { | |
35 | use Foo; | |
36 | ||
37 | #[rustc_then_this_would_need(TypeckItemBody)] //~ ERROR OK | |
38 | #[rustc_then_this_would_need(TransCrateItem)] //~ ERROR OK | |
39 | pub fn with_char() { | |
40 | char::method('a'); | |
41 | } | |
42 | ||
7453a54e SL |
43 | #[rustc_then_this_would_need(TypeckItemBody)] //~ ERROR OK |
44 | #[rustc_then_this_would_need(TransCrateItem)] //~ ERROR OK | |
9cc50fc6 SL |
45 | pub fn take_foo_with_char() { |
46 | take_foo::<char>('a'); | |
47 | } | |
48 | ||
49 | #[rustc_then_this_would_need(TypeckItemBody)] //~ ERROR OK | |
50 | #[rustc_then_this_would_need(TransCrateItem)] //~ ERROR OK | |
51 | pub fn with_u32() { | |
52 | u32::method(22); | |
53 | } | |
54 | ||
7453a54e SL |
55 | #[rustc_then_this_would_need(TypeckItemBody)] //~ ERROR OK |
56 | #[rustc_then_this_would_need(TransCrateItem)] //~ ERROR OK | |
9cc50fc6 SL |
57 | pub fn take_foo_with_u32() { |
58 | take_foo::<u32>(22); | |
59 | } | |
60 | ||
61 | pub fn take_foo<T:Foo>(t: T) { } | |
62 | } | |
63 | ||
64 | mod z { | |
65 | use y; | |
66 | ||
67 | // These are expected to yield errors, because changes to `x` | |
68 | // affect the BODY of `y`, but not its signature. | |
69 | #[rustc_then_this_would_need(TypeckItemBody)] //~ ERROR no path | |
70 | #[rustc_then_this_would_need(TransCrateItem)] //~ ERROR no path | |
71 | pub fn z() { | |
72 | y::with_char(); | |
73 | y::with_u32(); | |
74 | } | |
75 | } |