1 // Copyright 2016 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.
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.
12 // This test case tests the incremental compilation hash (ICH) implementation
13 // for let expressions.
15 // The general pattern followed here is: Change one thing between rev1 and rev2
16 // and make sure that the hash has changed, then change nothing between rev2 and
17 // rev3 and make sure that the hash has not changed.
19 // must-compile-successfully
20 // revisions: cfail1 cfail2 cfail3
21 // compile-flags: -Z query-dep-graph
25 #![feature(rustc_attrs)]
26 #![feature(specialization)]
31 // Change Method Name -----------------------------------------------------------
34 pub trait ChangeMethodNameTrait {
39 impl ChangeMethodNameTrait for Foo {
44 #[rustc_dirty(label="Hir", cfg="cfail2")]
45 #[rustc_clean(label="Hir", cfg="cfail3")]
46 #[rustc_metadata_dirty(cfg="cfail2")]
47 #[rustc_metadata_clean(cfg="cfail3")]
48 pub trait ChangeMethodNameTrait {
49 #[rustc_dirty(label="Hir", cfg="cfail2")]
50 #[rustc_clean(label="Hir", cfg="cfail3")]
51 #[rustc_metadata_dirty(cfg="cfail2")]
52 #[rustc_metadata_clean(cfg="cfail3")]
57 #[rustc_dirty(label="Hir", cfg="cfail2")]
58 #[rustc_clean(label="Hir", cfg="cfail3")]
59 #[rustc_metadata_dirty(cfg="cfail2")]
60 #[rustc_metadata_clean(cfg="cfail3")]
61 impl ChangeMethodNameTrait for Foo {
62 #[rustc_dirty(label="Hir", cfg="cfail2")]
63 #[rustc_clean(label="Hir", cfg="cfail3")]
64 #[rustc_metadata_dirty(cfg="cfail2")]
65 #[rustc_metadata_clean(cfg="cfail3")]
69 // Change Method Body -----------------------------------------------------------
71 // This should affect the method itself, but not the trait.
73 pub trait ChangeMethodBodyTrait {
78 impl ChangeMethodBodyTrait for Foo {
83 #[rustc_clean(label="Hir", cfg="cfail2")]
84 #[rustc_clean(label="Hir", cfg="cfail3")]
85 #[rustc_metadata_clean(cfg="cfail2")]
86 #[rustc_metadata_clean(cfg="cfail3")]
87 impl ChangeMethodBodyTrait for Foo {
88 #[rustc_dirty(label="Hir", cfg="cfail2")]
89 #[rustc_clean(label="Hir", cfg="cfail3")]
90 #[rustc_metadata_dirty(cfg="cfail2")]
91 #[rustc_metadata_clean(cfg="cfail3")]
97 // Change Method Selfness -----------------------------------------------------------
100 pub trait ChangeMethodSelfnessTrait {
105 impl ChangeMethodSelfnessTrait for Foo {
110 pub trait ChangeMethodSelfnessTrait {
111 fn method_name(&self);
115 #[rustc_dirty(label="Hir", cfg="cfail2")]
116 #[rustc_clean(label="Hir", cfg="cfail3")]
117 #[rustc_metadata_dirty(cfg="cfail2")]
118 #[rustc_metadata_clean(cfg="cfail3")]
119 impl ChangeMethodSelfnessTrait for Foo {
120 #[rustc_dirty(label="Hir", cfg="cfail2")]
121 #[rustc_clean(label="Hir", cfg="cfail3")]
122 #[rustc_metadata_dirty(cfg="cfail2")]
123 #[rustc_metadata_clean(cfg="cfail3")]
124 fn method_name(&self) {
129 // Change Method Selfness -----------------------------------------------------------
132 pub trait RemoveMethodSelfnessTrait {
133 fn method_name(&self);
137 impl RemoveMethodSelfnessTrait for Foo {
138 fn method_name(&self) { }
142 pub trait RemoveMethodSelfnessTrait {
147 #[rustc_dirty(label="Hir", cfg="cfail2")]
148 #[rustc_clean(label="Hir", cfg="cfail3")]
149 #[rustc_metadata_dirty(cfg="cfail2")]
150 #[rustc_metadata_clean(cfg="cfail3")]
151 impl RemoveMethodSelfnessTrait for Foo {
152 #[rustc_dirty(label="Hir", cfg="cfail2")]
153 #[rustc_clean(label="Hir", cfg="cfail3")]
154 #[rustc_metadata_dirty(cfg="cfail2")]
155 #[rustc_metadata_clean(cfg="cfail3")]
161 // Change Method Selfmutness -----------------------------------------------------------
164 pub trait ChangeMethodSelfmutnessTrait {
165 fn method_name(&self);
169 impl ChangeMethodSelfmutnessTrait for Foo {
170 fn method_name(&self) { }
174 pub trait ChangeMethodSelfmutnessTrait {
175 fn method_name(&mut self);
179 #[rustc_clean(label="Hir", cfg="cfail2")]
180 #[rustc_clean(label="Hir", cfg="cfail3")]
181 #[rustc_metadata_dirty(cfg="cfail2")]
182 #[rustc_metadata_clean(cfg="cfail3")]
183 impl ChangeMethodSelfmutnessTrait for Foo {
184 #[rustc_dirty(label="Hir", cfg="cfail2")]
185 #[rustc_clean(label="Hir", cfg="cfail3")]
186 #[rustc_metadata_dirty(cfg="cfail2")]
187 #[rustc_metadata_clean(cfg="cfail3")]
188 fn method_name(&mut self) {
193 // Change item kind -----------------------------------------------------------
196 pub trait ChangeItemKindTrait {
201 impl ChangeItemKindTrait for Foo {
206 pub trait ChangeItemKindTrait {
211 #[rustc_dirty(label="Hir", cfg="cfail2")]
212 #[rustc_clean(label="Hir", cfg="cfail3")]
213 #[rustc_metadata_dirty(cfg="cfail2")]
214 #[rustc_metadata_clean(cfg="cfail3")]
215 impl ChangeItemKindTrait for Foo {
219 // Remove item -----------------------------------------------------------
222 pub trait RemoveItemTrait {
228 impl RemoveItemTrait for Foo {
234 pub trait RemoveItemTrait {
239 #[rustc_dirty(label="Hir", cfg="cfail2")]
240 #[rustc_clean(label="Hir", cfg="cfail3")]
241 #[rustc_metadata_dirty(cfg="cfail2")]
242 #[rustc_metadata_clean(cfg="cfail3")]
243 impl RemoveItemTrait for Foo {
247 // Add item -----------------------------------------------------------
250 pub trait AddItemTrait {
255 impl AddItemTrait for Foo {
260 pub trait AddItemTrait {
266 #[rustc_dirty(label="Hir", cfg="cfail2")]
267 #[rustc_clean(label="Hir", cfg="cfail3")]
268 #[rustc_metadata_dirty(cfg="cfail2")]
269 #[rustc_metadata_clean(cfg="cfail3")]
270 impl AddItemTrait for Foo {
275 // Change has-value -----------------------------------------------------------
278 pub trait ChangeHasValueTrait {
283 impl ChangeHasValueTrait for Foo {
288 #[rustc_dirty(label="Hir", cfg="cfail2")]
289 #[rustc_clean(label="Hir", cfg="cfail3")]
290 #[rustc_metadata_dirty(cfg="cfail2")]
291 #[rustc_metadata_clean(cfg="cfail3")]
292 pub trait ChangeHasValueTrait {
297 #[rustc_clean(label="Hir", cfg="cfail2")]
298 #[rustc_clean(label="Hir", cfg="cfail3")]
299 #[rustc_metadata_dirty(cfg="cfail2")]
300 #[rustc_metadata_clean(cfg="cfail3")]
301 impl ChangeHasValueTrait for Foo {
307 pub trait AddDefaultTrait {
312 impl AddDefaultTrait for Foo {
317 #[rustc_dirty(label="Hir", cfg="cfail2")]
318 #[rustc_clean(label="Hir", cfg="cfail3")]
319 #[rustc_metadata_dirty(cfg="cfail2")]
320 #[rustc_metadata_clean(cfg="cfail3")]
321 impl AddDefaultTrait for Foo {
322 default fn method_name() { }
327 pub trait RemoveDefaultTrait {
332 impl RemoveDefaultTrait for Foo {
333 default fn method_name() { }
337 #[rustc_dirty(label="Hir", cfg="cfail2")]
338 #[rustc_clean(label="Hir", cfg="cfail3")]
339 #[rustc_metadata_dirty(cfg="cfail2")]
340 #[rustc_metadata_clean(cfg="cfail3")]
341 impl RemoveDefaultTrait for Foo {
348 pub trait AddArgumentTrait {
349 fn method_name(&self);
353 impl AddArgumentTrait for Foo {
354 fn method_name(&self) { }
358 pub trait AddArgumentTrait {
359 fn method_name(&self, x: u32);
363 #[rustc_clean(label="Hir", cfg="cfail2")]
364 #[rustc_clean(label="Hir", cfg="cfail3")]
365 #[rustc_metadata_dirty(cfg="cfail2")]
366 #[rustc_metadata_clean(cfg="cfail3")]
367 impl AddArgumentTrait for Foo {
368 #[rustc_dirty(label="Hir", cfg="cfail2")]
369 #[rustc_clean(label="Hir", cfg="cfail3")]
370 #[rustc_metadata_dirty(cfg="cfail2")]
371 #[rustc_metadata_clean(cfg="cfail3")]
372 fn method_name(&self, _x: u32) { }
375 // Change argument type
378 pub trait ChangeArgumentTypeTrait {
379 fn method_name(&self, x: u32);
383 impl ChangeArgumentTypeTrait for Foo {
384 fn method_name(&self, _x: u32) { }
388 pub trait ChangeArgumentTypeTrait {
389 fn method_name(&self, x: char);
393 #[rustc_clean(label="Hir", cfg="cfail2")]
394 #[rustc_clean(label="Hir", cfg="cfail3")]
395 #[rustc_metadata_dirty(cfg="cfail2")]
396 #[rustc_metadata_clean(cfg="cfail3")]
397 impl ChangeArgumentTypeTrait for Foo {
398 #[rustc_dirty(label="Hir", cfg="cfail2")]
399 #[rustc_clean(label="Hir", cfg="cfail3")]
400 #[rustc_metadata_dirty(cfg="cfail2")]
401 #[rustc_metadata_clean(cfg="cfail3")]
402 fn method_name(&self, _x: char) { }
409 // Add Type Parameter To Impl --------------------------------------------------
410 trait AddTypeParameterToImpl<T> {
415 impl AddTypeParameterToImpl<u32> for Bar<u32> {
416 fn id(t: u32) -> u32 { t }
420 #[rustc_dirty(label="Hir", cfg="cfail2")]
421 #[rustc_clean(label="Hir", cfg="cfail3")]
422 #[rustc_metadata_dirty(cfg="cfail2")]
423 #[rustc_metadata_clean(cfg="cfail3")]
424 impl<T> AddTypeParameterToImpl<T> for Bar<T> {
425 #[rustc_dirty(label="Hir", cfg="cfail2")]
426 #[rustc_clean(label="Hir", cfg="cfail3")]
427 #[rustc_metadata_dirty(cfg="cfail2")]
428 #[rustc_metadata_clean(cfg="cfail3")]
429 fn id(t: T) -> T { t }
434 // Change Self Type of Impl ----------------------------------------------------
435 trait ChangeSelfTypeOfImpl {
440 impl ChangeSelfTypeOfImpl for u32 {
441 fn id(self) -> Self { self }
445 #[rustc_dirty(label="Hir", cfg="cfail2")]
446 #[rustc_clean(label="Hir", cfg="cfail3")]
447 #[rustc_metadata_dirty(cfg="cfail2")]
448 #[rustc_metadata_clean(cfg="cfail3")]
449 impl ChangeSelfTypeOfImpl for u64 {
450 #[rustc_dirty(label="Hir", cfg="cfail2")]
451 #[rustc_clean(label="Hir", cfg="cfail3")]
452 #[rustc_metadata_dirty(cfg="cfail2")]
453 #[rustc_metadata_clean(cfg="cfail3")]
454 fn id(self) -> Self { self }
459 // Add Lifetime Bound to Impl --------------------------------------------------
460 trait AddLifetimeBoundToImplParameter {
465 impl<T> AddLifetimeBoundToImplParameter for T {
466 fn id(self) -> Self { self }
470 #[rustc_dirty(label="Hir", cfg="cfail2")]
471 #[rustc_clean(label="Hir", cfg="cfail3")]
472 #[rustc_metadata_dirty(cfg="cfail2")]
473 #[rustc_metadata_clean(cfg="cfail3")]
474 impl<T: 'static> AddLifetimeBoundToImplParameter for T {
475 #[rustc_dirty(label="Hir", cfg="cfail2")]
476 #[rustc_clean(label="Hir", cfg="cfail3")]
477 #[rustc_metadata_dirty(cfg="cfail2")]
478 #[rustc_metadata_clean(cfg="cfail3")]
479 fn id(self) -> Self { self }
484 // Add Trait Bound to Impl Parameter -------------------------------------------
485 trait AddTraitBoundToImplParameter {
490 impl<T> AddTraitBoundToImplParameter for T {
491 fn id(self) -> Self { self }
495 #[rustc_dirty(label="Hir", cfg="cfail2")]
496 #[rustc_clean(label="Hir", cfg="cfail3")]
497 #[rustc_metadata_dirty(cfg="cfail2")]
498 #[rustc_metadata_clean(cfg="cfail3")]
499 impl<T: Clone> AddTraitBoundToImplParameter for T {
500 #[rustc_dirty(label="Hir", cfg="cfail2")]
501 #[rustc_clean(label="Hir", cfg="cfail3")]
502 #[rustc_metadata_dirty(cfg="cfail2")]
503 #[rustc_metadata_clean(cfg="cfail3")]
504 fn id(self) -> Self { self }
509 // Add #[no_mangle] to Method --------------------------------------------------
510 trait AddNoMangleToMethod {
511 fn add_no_mangle_to_method(&self) { }
515 impl AddNoMangleToMethod for Foo {
516 fn add_no_mangle_to_method(&self) { }
520 #[rustc_clean(label="Hir", cfg="cfail2")]
521 #[rustc_clean(label="Hir", cfg="cfail3")]
522 #[rustc_metadata_clean(cfg="cfail2")]
523 #[rustc_metadata_clean(cfg="cfail3")]
524 impl AddNoMangleToMethod for Foo {
525 #[rustc_dirty(label="Hir", cfg="cfail2")]
526 #[rustc_clean(label="Hir", cfg="cfail3")]
527 #[rustc_metadata_dirty(cfg="cfail2")]
528 #[rustc_metadata_clean(cfg="cfail3")]
530 fn add_no_mangle_to_method(&self) { }
534 // Make Method #[inline] -------------------------------------------------------
535 trait MakeMethodInline {
536 fn make_method_inline(&self) -> u8 { 0 }
540 impl MakeMethodInline for Foo {
541 fn make_method_inline(&self) -> u8 { 0 }
545 #[rustc_clean(label="Hir", cfg="cfail2")]
546 #[rustc_clean(label="Hir", cfg="cfail3")]
547 #[rustc_metadata_clean(cfg="cfail2")]
548 #[rustc_metadata_clean(cfg="cfail3")]
549 impl MakeMethodInline for Foo {
550 #[rustc_dirty(label="Hir", cfg="cfail2")]
551 #[rustc_clean(label="Hir", cfg="cfail3")]
552 #[rustc_metadata_dirty(cfg="cfail2")]
553 #[rustc_metadata_clean(cfg="cfail3")]
555 fn make_method_inline(&self) -> u8 { 0 }