1 // This test case tests the incremental compilation hash (ICH) implementation
2 // for let expressions.
4 // The general pattern followed here is: Change one thing between rev1 and rev2
5 // and make sure that the hash has changed, then change nothing between rev2 and
6 // rev3 and make sure that the hash has not changed.
8 // build-pass (FIXME(62277): could be check-pass?)
9 // revisions: cfail1 cfail2 cfail3 cfail4 cfail5 cfail6
10 // compile-flags: -Z query-dep-graph -O
11 // [cfail1]compile-flags: -Zincremental-ignore-spans
12 // [cfail2]compile-flags: -Zincremental-ignore-spans
13 // [cfail3]compile-flags: -Zincremental-ignore-spans
14 // [cfail4]compile-flags: -Zincremental-relative-spans
15 // [cfail5]compile-flags: -Zincremental-relative-spans
16 // [cfail6]compile-flags: -Zincremental-relative-spans
19 #![feature(rustc_attrs)]
20 #![feature(specialization)]
25 // Change Method Name -----------------------------------------------------------
27 #[cfg(any(cfail1,cfail4))]
28 pub trait ChangeMethodNameTrait {
32 #[cfg(any(cfail1,cfail4))]
33 impl ChangeMethodNameTrait for Foo {
37 #[cfg(not(any(cfail1,cfail4)))]
38 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail2")]
39 #[rustc_clean(cfg="cfail3")]
40 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail5")]
41 #[rustc_clean(cfg="cfail6")]
42 pub trait ChangeMethodNameTrait {
43 #[rustc_clean(cfg="cfail3")]
44 #[rustc_clean(cfg="cfail6")]
48 #[cfg(not(any(cfail1,cfail4)))]
49 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail2")]
50 #[rustc_clean(cfg="cfail3")]
51 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail5")]
52 #[rustc_clean(cfg="cfail6")]
53 impl ChangeMethodNameTrait for Foo {
54 #[rustc_clean(cfg="cfail3")]
55 #[rustc_clean(cfg="cfail6")]
59 // Change Method Body -----------------------------------------------------------
61 // This should affect the method itself, but not the impl.
63 pub trait ChangeMethodBodyTrait {
67 #[cfg(any(cfail1,cfail4))]
68 impl ChangeMethodBodyTrait for Foo {
69 // ----------------------------------------------------------
70 // -------------------------
71 // ----------------------------------------------------------
72 // -------------------------
78 #[cfg(not(any(cfail1,cfail4)))]
79 #[rustc_clean(cfg="cfail2")]
80 #[rustc_clean(cfg="cfail3")]
81 #[rustc_clean(cfg="cfail5")]
82 #[rustc_clean(cfg="cfail6")]
83 impl ChangeMethodBodyTrait for Foo {
84 #[rustc_clean(except="hir_owner_nodes,typeck", cfg="cfail2")]
85 #[rustc_clean(cfg="cfail3")]
86 #[rustc_clean(except="hir_owner_nodes,typeck", cfg="cfail5")]
87 #[rustc_clean(cfg="cfail6")]
93 // Change Method Body (inlined fn) ---------------------------------------------
95 // This should affect the method itself, but not the impl.
97 pub trait ChangeMethodBodyTraitInlined {
101 #[cfg(any(cfail1,cfail4))]
102 impl ChangeMethodBodyTraitInlined for Foo {
103 // ------------------------------------------------------------------------
104 // -------------------------
105 // ------------------------------------------------------------------------
106 // -------------------------
113 #[cfg(not(any(cfail1,cfail4)))]
114 #[rustc_clean(cfg="cfail2")]
115 #[rustc_clean(cfg="cfail3")]
116 #[rustc_clean(cfg="cfail5")]
117 #[rustc_clean(cfg="cfail6")]
118 impl ChangeMethodBodyTraitInlined for Foo {
119 #[rustc_clean(except="hir_owner_nodes,typeck,optimized_mir", cfg="cfail2")]
120 #[rustc_clean(cfg="cfail3")]
121 #[rustc_clean(except="hir_owner_nodes,typeck,optimized_mir", cfg="cfail5")]
122 #[rustc_clean(cfg="cfail6")]
129 // Change Method Selfness ------------------------------------------------------
131 #[cfg(any(cfail1,cfail4))]
132 pub trait ChangeMethodSelfnessTrait {
136 #[cfg(any(cfail1,cfail4))]
137 impl ChangeMethodSelfnessTrait for Foo {
141 #[cfg(not(any(cfail1,cfail4)))]
142 pub trait ChangeMethodSelfnessTrait {
143 fn method_name(&self);
146 #[cfg(not(any(cfail1,cfail4)))]
147 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail2")]
148 #[rustc_clean(cfg="cfail3")]
149 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail5")]
150 #[rustc_clean(cfg="cfail6")]
151 impl ChangeMethodSelfnessTrait for Foo {
153 except="hir_owner,hir_owner_nodes,associated_item,generics_of,fn_sig,typeck,optimized_mir",
156 #[rustc_clean(cfg="cfail3")]
158 except="hir_owner,hir_owner_nodes,associated_item,generics_of,fn_sig,typeck,optimized_mir",
161 #[rustc_clean(cfg="cfail6")]
162 fn method_name(&self) {
167 // Change Method Selfness -----------------------------------------------------------
169 #[cfg(any(cfail1,cfail4))]
170 pub trait RemoveMethodSelfnessTrait {
171 fn method_name(&self);
174 #[cfg(any(cfail1,cfail4))]
175 impl RemoveMethodSelfnessTrait for Foo {
176 fn method_name(&self) { }
179 #[cfg(not(any(cfail1,cfail4)))]
180 pub trait RemoveMethodSelfnessTrait {
184 #[cfg(not(any(cfail1,cfail4)))]
185 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail2")]
186 #[rustc_clean(cfg="cfail3")]
187 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail5")]
188 #[rustc_clean(cfg="cfail6")]
189 impl RemoveMethodSelfnessTrait for Foo {
191 except="hir_owner,hir_owner_nodes,associated_item,generics_of,fn_sig,typeck,optimized_mir",
194 #[rustc_clean(cfg="cfail3")]
196 except="hir_owner,hir_owner_nodes,associated_item,generics_of,fn_sig,typeck,optimized_mir",
199 #[rustc_clean(cfg="cfail6")]
203 // Change Method Selfmutness -----------------------------------------------------------
205 #[cfg(any(cfail1,cfail4))]
206 pub trait ChangeMethodSelfmutnessTrait {
207 fn method_name(&self);
210 #[cfg(any(cfail1,cfail4))]
211 impl ChangeMethodSelfmutnessTrait for Foo {
212 // -----------------------------------------------------------------------------------------
213 // -------------------------
214 // -----------------------------------------------------------------------------------------
215 // -------------------------
216 fn method_name(& self) {}
219 #[cfg(not(any(cfail1,cfail4)))]
220 pub trait ChangeMethodSelfmutnessTrait {
221 fn method_name(&mut self);
224 #[cfg(not(any(cfail1,cfail4)))]
225 #[rustc_clean(cfg="cfail2")]
226 #[rustc_clean(cfg="cfail3")]
227 #[rustc_clean(cfg="cfail5")]
228 #[rustc_clean(cfg="cfail6")]
229 impl ChangeMethodSelfmutnessTrait for Foo {
230 #[rustc_clean(except="hir_owner,hir_owner_nodes,fn_sig,typeck,optimized_mir", cfg="cfail2")]
231 #[rustc_clean(cfg="cfail3")]
232 #[rustc_clean(except="hir_owner,hir_owner_nodes,fn_sig,typeck,optimized_mir", cfg="cfail5")]
233 #[rustc_clean(cfg="cfail6")]
234 fn method_name(&mut self) {}
237 // Change item kind -----------------------------------------------------------
239 #[cfg(any(cfail1,cfail4))]
240 pub trait ChangeItemKindTrait {
244 #[cfg(any(cfail1,cfail4))]
245 impl ChangeItemKindTrait for Foo {
249 #[cfg(not(any(cfail1,cfail4)))]
250 pub trait ChangeItemKindTrait {
254 #[cfg(not(any(cfail1,cfail4)))]
255 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail2")]
256 #[rustc_clean(cfg="cfail3")]
257 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail5")]
258 #[rustc_clean(cfg="cfail6")]
259 impl ChangeItemKindTrait for Foo {
263 // Remove item -----------------------------------------------------------
265 #[cfg(any(cfail1,cfail4))]
266 pub trait RemoveItemTrait {
271 #[cfg(any(cfail1,cfail4))]
272 impl RemoveItemTrait for Foo {
277 #[cfg(not(any(cfail1,cfail4)))]
278 pub trait RemoveItemTrait {
282 #[cfg(not(any(cfail1,cfail4)))]
283 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail2")]
284 #[rustc_clean(cfg="cfail3")]
285 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail5")]
286 #[rustc_clean(cfg="cfail6")]
287 impl RemoveItemTrait for Foo {
291 // Add item -----------------------------------------------------------
293 #[cfg(any(cfail1,cfail4))]
294 pub trait AddItemTrait {
298 #[cfg(any(cfail1,cfail4))]
299 impl AddItemTrait for Foo {
303 #[cfg(not(any(cfail1,cfail4)))]
304 pub trait AddItemTrait {
309 #[cfg(not(any(cfail1,cfail4)))]
310 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail2")]
311 #[rustc_clean(cfg="cfail3")]
312 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item_def_ids", cfg="cfail5")]
313 #[rustc_clean(cfg="cfail6")]
314 impl AddItemTrait for Foo {
319 // Change has-value -----------------------------------------------------------
321 #[cfg(any(cfail1,cfail4))]
322 pub trait ChangeHasValueTrait {
326 #[cfg(any(cfail1,cfail4))]
327 impl ChangeHasValueTrait for Foo {
331 #[cfg(not(any(cfail1,cfail4)))]
332 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail2")]
333 #[rustc_clean(cfg="cfail3")]
334 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail5")]
335 #[rustc_clean(cfg="cfail6")]
336 pub trait ChangeHasValueTrait {
337 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item", cfg="cfail2")]
338 #[rustc_clean(cfg="cfail3")]
339 #[rustc_clean(except="hir_owner,hir_owner_nodes,associated_item", cfg="cfail5")]
340 #[rustc_clean(cfg="cfail6")]
344 #[cfg(not(any(cfail1,cfail4)))]
345 #[rustc_clean(cfg="cfail2")]
346 #[rustc_clean(cfg="cfail3")]
347 #[rustc_clean(cfg="cfail5")]
348 #[rustc_clean(cfg="cfail6")]
349 impl ChangeHasValueTrait for Foo {
355 pub trait AddDefaultTrait {
359 #[cfg(any(cfail1,cfail4))]
360 impl AddDefaultTrait for Foo {
361 // ----------------------------------------------------
362 // -------------------------
363 // ----------------------------------------------------
364 // -------------------------
368 #[cfg(not(any(cfail1,cfail4)))]
369 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail2")]
370 #[rustc_clean(cfg="cfail3")]
371 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail5")]
372 #[rustc_clean(cfg="cfail6")]
373 impl AddDefaultTrait for Foo {
374 #[rustc_clean(except="associated_item", cfg="cfail2")]
375 #[rustc_clean(cfg="cfail3")]
376 #[rustc_clean(except="associated_item", cfg="cfail5")]
377 #[rustc_clean(cfg="cfail6")]
378 default fn method_name() { }
383 #[cfg(any(cfail1,cfail4))]
384 pub trait AddArgumentTrait {
385 fn method_name(&self);
388 #[cfg(any(cfail1,cfail4))]
389 impl AddArgumentTrait for Foo {
390 // -----------------------------------------------------------------------------------------
391 // -------------------------
392 // -----------------------------------------------------------------------------------------
393 // -------------------------
394 fn method_name(&self ) { }
397 #[cfg(not(any(cfail1,cfail4)))]
398 pub trait AddArgumentTrait {
399 fn method_name(&self, x: u32);
402 #[cfg(not(any(cfail1,cfail4)))]
403 #[rustc_clean(cfg="cfail2")]
404 #[rustc_clean(cfg="cfail3")]
405 #[rustc_clean(cfg="cfail5")]
406 #[rustc_clean(cfg="cfail6")]
407 impl AddArgumentTrait for Foo {
408 #[rustc_clean(except="hir_owner,hir_owner_nodes,fn_sig,typeck,optimized_mir", cfg="cfail2")]
409 #[rustc_clean(cfg="cfail3")]
410 #[rustc_clean(except="hir_owner,hir_owner_nodes,fn_sig,typeck,optimized_mir", cfg="cfail5")]
411 #[rustc_clean(cfg="cfail6")]
412 fn method_name(&self, _x: u32) { }
415 // Change argument type
417 #[cfg(any(cfail1,cfail4))]
418 pub trait ChangeArgumentTypeTrait {
419 fn method_name(&self, x: u32);
422 #[cfg(any(cfail1,cfail4))]
423 impl ChangeArgumentTypeTrait for Foo {
424 // -----------------------------------------------------------------------------------------
425 // -------------------------
426 // -----------------------------------------------------------------------------------------
427 // -------------------------
428 fn method_name(&self, _x: u32 ) { }
431 #[cfg(not(any(cfail1,cfail4)))]
432 pub trait ChangeArgumentTypeTrait {
433 fn method_name(&self, x: char);
436 #[cfg(not(any(cfail1,cfail4)))]
437 #[rustc_clean(cfg="cfail2")]
438 #[rustc_clean(cfg="cfail3")]
439 #[rustc_clean(cfg="cfail5")]
440 #[rustc_clean(cfg="cfail6")]
441 impl ChangeArgumentTypeTrait for Foo {
442 #[rustc_clean(except="hir_owner,hir_owner_nodes,fn_sig,typeck,optimized_mir", cfg="cfail2")]
443 #[rustc_clean(cfg="cfail3")]
444 #[rustc_clean(except="hir_owner,hir_owner_nodes,fn_sig,typeck,optimized_mir", cfg="cfail5")]
445 #[rustc_clean(cfg="cfail6")]
446 fn method_name(&self, _x: char) { }
453 // Add Type Parameter To Impl --------------------------------------------------
454 trait AddTypeParameterToImpl<T> {
458 #[cfg(any(cfail1,cfail4))]
459 impl AddTypeParameterToImpl<u32> for Bar<u32> {
460 fn id(t: u32) -> u32 { t }
463 #[cfg(not(any(cfail1,cfail4)))]
464 #[rustc_clean(except="hir_owner,hir_owner_nodes,generics_of,impl_trait_ref", cfg="cfail2")]
465 #[rustc_clean(cfg="cfail3")]
466 #[rustc_clean(except="hir_owner,hir_owner_nodes,generics_of,impl_trait_ref", cfg="cfail5")]
467 #[rustc_clean(cfg="cfail6")]
468 impl<TTT> AddTypeParameterToImpl<TTT> for Bar<TTT> {
470 except="hir_owner,hir_owner_nodes,generics_of,fn_sig,type_of,typeck,optimized_mir",
473 #[rustc_clean(cfg="cfail3")]
475 except="hir_owner,hir_owner_nodes,generics_of,fn_sig,type_of,typeck,optimized_mir",
478 #[rustc_clean(cfg="cfail6")]
479 fn id(t: TTT) -> TTT { t }
484 // Change Self Type of Impl ----------------------------------------------------
485 trait ChangeSelfTypeOfImpl {
489 #[cfg(any(cfail1,cfail4))]
490 impl ChangeSelfTypeOfImpl for u32 {
491 fn id(self) -> Self { self }
494 #[cfg(not(any(cfail1,cfail4)))]
495 #[rustc_clean(except="hir_owner,hir_owner_nodes,impl_trait_ref", cfg="cfail2")]
496 #[rustc_clean(cfg="cfail3")]
497 #[rustc_clean(except="hir_owner,hir_owner_nodes,impl_trait_ref", cfg="cfail5")]
498 #[rustc_clean(cfg="cfail6")]
499 impl ChangeSelfTypeOfImpl for u64 {
500 #[rustc_clean(except="fn_sig,typeck,optimized_mir", cfg="cfail2")]
501 #[rustc_clean(cfg="cfail3")]
502 #[rustc_clean(except="fn_sig,typeck,optimized_mir", cfg="cfail5")]
503 #[rustc_clean(cfg="cfail6")]
504 fn id(self) -> Self { self }
509 // Add Lifetime Bound to Impl --------------------------------------------------
510 trait AddLifetimeBoundToImplParameter {
514 #[cfg(any(cfail1,cfail4))]
515 impl<T> AddLifetimeBoundToImplParameter for T {
516 fn id(self) -> Self { self }
519 #[cfg(not(any(cfail1,cfail4)))]
520 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail2")]
521 #[rustc_clean(cfg="cfail3")]
522 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail5")]
523 #[rustc_clean(cfg="cfail6")]
524 impl<T: 'static> AddLifetimeBoundToImplParameter for T {
525 #[rustc_clean(cfg="cfail2")]
526 #[rustc_clean(cfg="cfail3")]
527 #[rustc_clean(cfg="cfail5")]
528 #[rustc_clean(cfg="cfail6")]
529 fn id(self) -> Self { self }
534 // Add Trait Bound to Impl Parameter -------------------------------------------
535 trait AddTraitBoundToImplParameter {
539 #[cfg(any(cfail1,cfail4))]
540 impl<T> AddTraitBoundToImplParameter for T {
541 fn id(self) -> Self { self }
544 #[cfg(not(any(cfail1,cfail4)))]
545 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail2")]
546 #[rustc_clean(cfg="cfail3")]
547 #[rustc_clean(except="hir_owner,hir_owner_nodes", cfg="cfail5")]
548 #[rustc_clean(cfg="cfail6")]
549 impl<T: Clone> AddTraitBoundToImplParameter for T {
550 #[rustc_clean(cfg="cfail2")]
551 #[rustc_clean(cfg="cfail3")]
552 #[rustc_clean(cfg="cfail5")]
553 #[rustc_clean(cfg="cfail6")]
554 fn id(self) -> Self { self }
559 // Add #[no_mangle] to Method --------------------------------------------------
560 trait AddNoMangleToMethod {
561 fn add_no_mangle_to_method(&self) { }
564 #[cfg(any(cfail1,cfail4))]
565 impl AddNoMangleToMethod for Foo {
566 // -------------------------
567 // -------------------------
568 // -------------------------
569 // -------------------------
571 fn add_no_mangle_to_method(&self) { }
574 #[cfg(not(any(cfail1,cfail4)))]
575 #[rustc_clean(cfg="cfail2")]
576 #[rustc_clean(cfg="cfail3")]
577 #[rustc_clean(cfg="cfail5")]
578 #[rustc_clean(cfg="cfail6")]
579 impl AddNoMangleToMethod for Foo {
580 #[rustc_clean(cfg="cfail2")]
581 #[rustc_clean(cfg="cfail3")]
582 #[rustc_clean(cfg="cfail5")]
583 #[rustc_clean(cfg="cfail6")]
585 fn add_no_mangle_to_method(&self) { }
589 // Make Method #[inline] -------------------------------------------------------
590 trait MakeMethodInline {
591 fn make_method_inline(&self) -> u8 { 0 }
594 #[cfg(any(cfail1,cfail4))]
595 impl MakeMethodInline for Foo {
596 // -------------------------
597 // -------------------------
598 // -------------------------
599 // -------------------------
601 fn make_method_inline(&self) -> u8 { 0 }
604 #[cfg(not(any(cfail1,cfail4)))]
605 #[rustc_clean(cfg="cfail2")]
606 #[rustc_clean(cfg="cfail3")]
607 #[rustc_clean(cfg="cfail5")]
608 #[rustc_clean(cfg="cfail6")]
609 impl MakeMethodInline for Foo {
610 #[rustc_clean(cfg="cfail2")]
611 #[rustc_clean(cfg="cfail3")]
612 #[rustc_clean(cfg="cfail5")]
613 #[rustc_clean(cfg="cfail6")]
615 fn make_method_inline(&self) -> u8 { 0 }