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 trait definitions.
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 // We also test the ICH for trait definitions exported in metadata. Same as
20 // above, we want to make sure that the change between rev1 and rev2 also
21 // results in a change of the ICH for the trait's metadata, and that it stays
22 // the same between rev2 and rev3.
24 // must-compile-successfully
25 // revisions: cfail1 cfail2 cfail3
26 // compile-flags: -Z query-dep-graph
29 #![feature(rustc_attrs)]
31 #![feature(associated_type_defaults)]
32 #![feature(intrinsics)]
33 #![feature(associated_consts)]
36 // Change trait visibility --------------------------------------------------------
38 trait TraitVisibility { }
41 #[rustc_dirty(label="Hir", cfg="cfail2")]
42 #[rustc_clean(label="Hir", cfg="cfail3")]
43 #[rustc_metadata_clean(cfg="cfail3")]
44 pub trait TraitVisibility { }
48 // Change trait unsafety ----------------------------------------------------------
50 trait TraitUnsafety { }
53 #[rustc_dirty(label="Hir", cfg="cfail2")]
54 #[rustc_clean(label="Hir", cfg="cfail3")]
55 #[rustc_metadata_dirty(cfg="cfail2")]
56 #[rustc_metadata_clean(cfg="cfail3")]
57 unsafe trait TraitUnsafety { }
61 // Add method ---------------------------------------------------------------------
63 trait TraitAddMethod {
67 #[rustc_dirty(label="Hir", cfg="cfail2")]
68 #[rustc_clean(label="Hir", cfg="cfail3")]
69 #[rustc_metadata_dirty(cfg="cfail2")]
70 #[rustc_metadata_clean(cfg="cfail3")]
71 pub trait TraitAddMethod {
77 // Change name of method ----------------------------------------------------------
79 trait TraitChangeMethodName {
84 #[rustc_dirty(label="Hir", cfg="cfail2")]
85 #[rustc_clean(label="Hir", cfg="cfail3")]
86 #[rustc_metadata_dirty(cfg="cfail2")]
87 #[rustc_metadata_clean(cfg="cfail3")]
88 trait TraitChangeMethodName {
94 // Add return type to method ------------------------------------------------------
96 trait TraitAddReturnType {
101 #[rustc_clean(label="Hir", cfg="cfail2")]
102 #[rustc_clean(label="Hir", cfg="cfail3")]
103 #[rustc_metadata_dirty(cfg="cfail2")]
104 #[rustc_metadata_clean(cfg="cfail3")]
105 trait TraitAddReturnType {
106 #[rustc_dirty(label="Hir", cfg="cfail2")]
107 #[rustc_clean(label="Hir", cfg="cfail3")]
108 #[rustc_metadata_dirty(cfg="cfail2")]
109 #[rustc_metadata_clean(cfg="cfail3")]
115 // Change return type of method ---------------------------------------------------
117 trait TraitChangeReturnType {
122 #[rustc_clean(label="Hir", cfg="cfail2")]
123 #[rustc_clean(label="Hir", cfg="cfail3")]
124 #[rustc_metadata_dirty(cfg="cfail2")]
125 #[rustc_metadata_clean(cfg="cfail3")]
126 trait TraitChangeReturnType {
127 #[rustc_dirty(label="Hir", cfg="cfail2")]
128 #[rustc_clean(label="Hir", cfg="cfail3")]
129 #[rustc_metadata_dirty(cfg="cfail2")]
130 #[rustc_metadata_clean(cfg="cfail3")]
136 // Add parameter to method --------------------------------------------------------
138 trait TraitAddParameterToMethod {
143 #[rustc_clean(label="Hir", cfg="cfail2")]
144 #[rustc_clean(label="Hir", cfg="cfail3")]
145 #[rustc_metadata_dirty(cfg="cfail2")]
146 #[rustc_metadata_clean(cfg="cfail3")]
147 trait TraitAddParameterToMethod {
148 #[rustc_dirty(label="Hir", cfg="cfail2")]
149 #[rustc_clean(label="Hir", cfg="cfail3")]
150 #[rustc_metadata_dirty(cfg="cfail2")]
151 #[rustc_metadata_clean(cfg="cfail3")]
157 // Change name of method parameter ------------------------------------------------
159 trait TraitChangeMethodParameterName {
161 fn with_default(x: i32) {}
165 #[rustc_clean(label="Hir", cfg="cfail2")]
166 #[rustc_clean(label="Hir", cfg="cfail3")]
167 #[rustc_metadata_dirty(cfg="cfail2")]
168 #[rustc_metadata_clean(cfg="cfail3")]
169 trait TraitChangeMethodParameterName {
170 // FIXME(#38501) This should preferably always be clean.
171 #[rustc_dirty(label="Hir", cfg="cfail2")]
172 #[rustc_clean(label="Hir", cfg="cfail3")]
173 #[rustc_metadata_dirty(cfg="cfail2")]
174 #[rustc_metadata_clean(cfg="cfail3")]
177 #[rustc_clean(label="Hir", cfg="cfail2")]
178 #[rustc_clean(label="Hir", cfg="cfail3")]
179 #[rustc_dirty(label="HirBody", cfg="cfail2")]
180 #[rustc_clean(label="HirBody", cfg="cfail3")]
181 #[rustc_metadata_dirty(cfg="cfail2")]
182 #[rustc_metadata_clean(cfg="cfail3")]
183 fn with_default(y: i32) {}
188 // Change type of method parameter (i32 => i64) -----------------------------------
190 trait TraitChangeMethodParameterType {
195 #[rustc_clean(label="Hir", cfg="cfail2")]
196 #[rustc_clean(label="Hir", cfg="cfail3")]
197 #[rustc_metadata_dirty(cfg="cfail2")]
198 #[rustc_metadata_clean(cfg="cfail3")]
199 trait TraitChangeMethodParameterType {
200 #[rustc_dirty(label="Hir", cfg="cfail2")]
201 #[rustc_clean(label="Hir", cfg="cfail3")]
202 #[rustc_metadata_dirty(cfg="cfail2")]
203 #[rustc_metadata_clean(cfg="cfail3")]
209 // Change type of method parameter (&i32 => &mut i32) -----------------------------
211 trait TraitChangeMethodParameterTypeRef {
216 #[rustc_clean(label="Hir", cfg="cfail2")]
217 #[rustc_clean(label="Hir", cfg="cfail3")]
218 #[rustc_metadata_dirty(cfg="cfail2")]
219 #[rustc_metadata_clean(cfg="cfail3")]
220 trait TraitChangeMethodParameterTypeRef {
221 #[rustc_dirty(label="Hir", cfg="cfail2")]
222 #[rustc_clean(label="Hir", cfg="cfail3")]
223 #[rustc_metadata_dirty(cfg="cfail2")]
224 #[rustc_metadata_clean(cfg="cfail3")]
225 fn method(a: &mut i32);
230 // Change order of method parameters ----------------------------------------------
232 trait TraitChangeMethodParametersOrder {
233 fn method(a: i32, b: i64);
237 #[rustc_clean(label="Hir", cfg="cfail2")]
238 #[rustc_clean(label="Hir", cfg="cfail3")]
239 #[rustc_metadata_dirty(cfg="cfail2")]
240 #[rustc_metadata_clean(cfg="cfail3")]
241 trait TraitChangeMethodParametersOrder {
242 #[rustc_dirty(label="Hir", cfg="cfail2")]
243 #[rustc_clean(label="Hir", cfg="cfail3")]
244 #[rustc_metadata_dirty(cfg="cfail2")]
245 #[rustc_metadata_clean(cfg="cfail3")]
246 fn method(b: i64, a: i32);
251 // Add default implementation to method -------------------------------------------
253 trait TraitAddMethodDefaultImplementation {
258 #[rustc_dirty(label="Hir", cfg="cfail2")]
259 #[rustc_clean(label="Hir", cfg="cfail3")]
260 #[rustc_metadata_dirty(cfg="cfail2")]
261 #[rustc_metadata_clean(cfg="cfail3")]
262 trait TraitAddMethodDefaultImplementation {
268 // Change order of methods --------------------------------------------------------
270 trait TraitChangeOrderOfMethods {
276 #[rustc_dirty(label="Hir", cfg="cfail2")]
277 #[rustc_clean(label="Hir", cfg="cfail3")]
278 #[rustc_metadata_dirty(cfg="cfail2")]
279 #[rustc_metadata_clean(cfg="cfail3")]
280 trait TraitChangeOrderOfMethods {
287 // Change mode of self parameter --------------------------------------------------
289 trait TraitChangeModeSelfRefToMut {
294 #[rustc_clean(label="Hir", cfg="cfail2")]
295 #[rustc_clean(label="Hir", cfg="cfail3")]
296 #[rustc_metadata_dirty(cfg="cfail2")]
297 #[rustc_metadata_clean(cfg="cfail3")]
298 trait TraitChangeModeSelfRefToMut {
299 #[rustc_dirty(label="Hir", cfg="cfail2")]
300 #[rustc_clean(label="Hir", cfg="cfail3")]
301 #[rustc_metadata_dirty(cfg="cfail2")]
302 #[rustc_metadata_clean(cfg="cfail3")]
303 fn method(&mut self);
309 trait TraitChangeModeSelfOwnToMut: Sized {
314 #[rustc_clean(label="Hir", cfg="cfail2")]
315 #[rustc_clean(label="Hir", cfg="cfail3")]
316 #[rustc_metadata_clean(cfg="cfail2")]
317 #[rustc_metadata_clean(cfg="cfail3")]
318 trait TraitChangeModeSelfOwnToMut: Sized {
319 #[rustc_dirty(label="Hir", cfg="cfail2")]
320 #[rustc_clean(label="Hir", cfg="cfail3")]
321 #[rustc_metadata_dirty(cfg="cfail2")]
322 #[rustc_metadata_clean(cfg="cfail3")]
323 fn method(mut self) {}
329 trait TraitChangeModeSelfOwnToRef {
334 #[rustc_clean(label="Hir", cfg="cfail2")]
335 #[rustc_clean(label="Hir", cfg="cfail3")]
336 #[rustc_metadata_dirty(cfg="cfail2")]
337 #[rustc_metadata_clean(cfg="cfail3")]
338 trait TraitChangeModeSelfOwnToRef {
339 #[rustc_dirty(label="Hir", cfg="cfail2")]
340 #[rustc_clean(label="Hir", cfg="cfail3")]
341 #[rustc_metadata_dirty(cfg="cfail2")]
342 #[rustc_metadata_clean(cfg="cfail3")]
348 // Add unsafe modifier to method --------------------------------------------------
350 trait TraitAddUnsafeModifier {
355 #[rustc_clean(label="Hir", cfg="cfail2")]
356 #[rustc_clean(label="Hir", cfg="cfail3")]
357 #[rustc_metadata_dirty(cfg="cfail2")]
358 #[rustc_metadata_clean(cfg="cfail3")]
359 trait TraitAddUnsafeModifier {
360 #[rustc_dirty(label="Hir", cfg="cfail2")]
361 #[rustc_clean(label="Hir", cfg="cfail3")]
362 #[rustc_metadata_dirty(cfg="cfail2")]
363 #[rustc_metadata_clean(cfg="cfail3")]
369 // Add extern modifier to method --------------------------------------------------
371 trait TraitAddExternModifier {
376 #[rustc_clean(label="Hir", cfg="cfail2")]
377 #[rustc_clean(label="Hir", cfg="cfail3")]
378 #[rustc_metadata_dirty(cfg="cfail2")]
379 #[rustc_metadata_clean(cfg="cfail3")]
380 trait TraitAddExternModifier {
381 #[rustc_dirty(label="Hir", cfg="cfail2")]
382 #[rustc_clean(label="Hir", cfg="cfail3")]
383 #[rustc_metadata_dirty(cfg="cfail2")]
384 #[rustc_metadata_clean(cfg="cfail3")]
390 // Change extern "C" to extern "rust-intrinsic" -----------------------------------
392 trait TraitChangeExternCToRustIntrinsic {
393 extern "C" fn method();
397 #[rustc_clean(label="Hir", cfg="cfail2")]
398 #[rustc_clean(label="Hir", cfg="cfail3")]
399 #[rustc_metadata_dirty(cfg="cfail2")]
400 #[rustc_metadata_clean(cfg="cfail3")]
401 trait TraitChangeExternCToRustIntrinsic {
402 #[rustc_dirty(label="Hir", cfg="cfail2")]
403 #[rustc_clean(label="Hir", cfg="cfail3")]
404 #[rustc_metadata_dirty(cfg="cfail2")]
405 #[rustc_metadata_clean(cfg="cfail3")]
406 extern "rust-intrinsic" fn method();
411 // Add type parameter to method ---------------------------------------------------
413 trait TraitAddTypeParameterToMethod {
418 #[rustc_clean(label="Hir", cfg="cfail2")]
419 #[rustc_clean(label="Hir", cfg="cfail3")]
420 #[rustc_metadata_dirty(cfg="cfail2")]
421 #[rustc_metadata_clean(cfg="cfail3")]
422 trait TraitAddTypeParameterToMethod {
423 #[rustc_dirty(label="Hir", cfg="cfail2")]
424 #[rustc_clean(label="Hir", cfg="cfail3")]
425 #[rustc_metadata_dirty(cfg="cfail2")]
426 #[rustc_metadata_clean(cfg="cfail3")]
432 // Add lifetime parameter to method -----------------------------------------------
434 trait TraitAddLifetimeParameterToMethod {
439 #[rustc_clean(label="Hir", cfg="cfail2")]
440 #[rustc_clean(label="Hir", cfg="cfail3")]
441 #[rustc_metadata_dirty(cfg="cfail2")]
442 #[rustc_metadata_clean(cfg="cfail3")]
443 trait TraitAddLifetimeParameterToMethod {
444 #[rustc_dirty(label="Hir", cfg="cfail2")]
445 #[rustc_clean(label="Hir", cfg="cfail3")]
446 #[rustc_metadata_dirty(cfg="cfail2")]
447 #[rustc_metadata_clean(cfg="cfail3")]
453 // dummy trait for bound
454 trait ReferencedTrait0 { }
455 trait ReferencedTrait1 { }
457 // Add trait bound to method type parameter ---------------------------------------
459 trait TraitAddTraitBoundToMethodTypeParameter {
464 #[rustc_clean(label="Hir", cfg="cfail2")]
465 #[rustc_clean(label="Hir", cfg="cfail3")]
466 #[rustc_metadata_dirty(cfg="cfail2")]
467 #[rustc_metadata_clean(cfg="cfail3")]
468 trait TraitAddTraitBoundToMethodTypeParameter {
469 #[rustc_dirty(label="Hir", cfg="cfail2")]
470 #[rustc_clean(label="Hir", cfg="cfail3")]
471 #[rustc_metadata_dirty(cfg="cfail2")]
472 #[rustc_metadata_clean(cfg="cfail3")]
473 fn method<T: ReferencedTrait0>();
478 // Add builtin bound to method type parameter -------------------------------------
480 trait TraitAddBuiltinBoundToMethodTypeParameter {
485 #[rustc_clean(label="Hir", cfg="cfail2")]
486 #[rustc_clean(label="Hir", cfg="cfail3")]
487 #[rustc_metadata_dirty(cfg="cfail2")]
488 #[rustc_metadata_clean(cfg="cfail3")]
489 trait TraitAddBuiltinBoundToMethodTypeParameter {
490 #[rustc_dirty(label="Hir", cfg="cfail2")]
491 #[rustc_clean(label="Hir", cfg="cfail3")]
492 #[rustc_metadata_dirty(cfg="cfail2")]
493 #[rustc_metadata_clean(cfg="cfail3")]
494 fn method<T: Sized>();
499 // Add lifetime bound to method lifetime parameter ------------------------------------
501 trait TraitAddLifetimeBoundToMethodLifetimeParameter {
502 fn method<'a, 'b>(a: &'a u32, b: &'b u32);
506 #[rustc_clean(label="Hir", cfg="cfail2")]
507 #[rustc_clean(label="Hir", cfg="cfail3")]
508 #[rustc_metadata_dirty(cfg="cfail2")]
509 #[rustc_metadata_clean(cfg="cfail3")]
510 trait TraitAddLifetimeBoundToMethodLifetimeParameter {
511 #[rustc_dirty(label="Hir", cfg="cfail2")]
512 #[rustc_clean(label="Hir", cfg="cfail3")]
513 #[rustc_metadata_dirty(cfg="cfail2")]
514 #[rustc_metadata_clean(cfg="cfail3")]
515 fn method<'a, 'b: 'a>(a: &'a u32, b: &'b u32);
520 // Add second trait bound to method type parameter --------------------------------
522 trait TraitAddSecondTraitBoundToMethodTypeParameter {
523 fn method<T: ReferencedTrait0>();
527 #[rustc_clean(label="Hir", cfg="cfail2")]
528 #[rustc_clean(label="Hir", cfg="cfail3")]
529 #[rustc_metadata_dirty(cfg="cfail2")]
530 #[rustc_metadata_clean(cfg="cfail3")]
531 trait TraitAddSecondTraitBoundToMethodTypeParameter {
532 #[rustc_dirty(label="Hir", cfg="cfail2")]
533 #[rustc_clean(label="Hir", cfg="cfail3")]
534 #[rustc_metadata_dirty(cfg="cfail2")]
535 #[rustc_metadata_clean(cfg="cfail3")]
536 fn method<T: ReferencedTrait0 + ReferencedTrait1>();
541 // Add second builtin bound to method type parameter ------------------------------
543 trait TraitAddSecondBuiltinBoundToMethodTypeParameter {
544 fn method<T: Sized>();
548 #[rustc_clean(label="Hir", cfg="cfail2")]
549 #[rustc_clean(label="Hir", cfg="cfail3")]
550 #[rustc_metadata_dirty(cfg="cfail2")]
551 #[rustc_metadata_clean(cfg="cfail3")]
552 trait TraitAddSecondBuiltinBoundToMethodTypeParameter {
553 #[rustc_dirty(label="Hir", cfg="cfail2")]
554 #[rustc_clean(label="Hir", cfg="cfail3")]
555 #[rustc_metadata_dirty(cfg="cfail2")]
556 #[rustc_metadata_clean(cfg="cfail3")]
557 fn method<T: Sized + Sync>();
562 // Add second lifetime bound to method lifetime parameter -----------------------------
564 trait TraitAddSecondLifetimeBoundToMethodLifetimeParameter {
565 fn method<'a, 'b, 'c: 'a>(a: &'a u32, b: &'b u32, c: &'c u32);
569 #[rustc_clean(label="Hir", cfg="cfail2")]
570 #[rustc_clean(label="Hir", cfg="cfail3")]
571 #[rustc_metadata_dirty(cfg="cfail2")]
572 #[rustc_metadata_clean(cfg="cfail3")]
573 trait TraitAddSecondLifetimeBoundToMethodLifetimeParameter {
574 #[rustc_dirty(label="Hir", cfg="cfail2")]
575 #[rustc_clean(label="Hir", cfg="cfail3")]
576 #[rustc_metadata_dirty(cfg="cfail2")]
577 #[rustc_metadata_clean(cfg="cfail3")]
578 fn method<'a, 'b, 'c: 'a + 'b>(a: &'a u32, b: &'b u32, c: &'c u32);
583 // Add associated type ------------------------------------------------------------
585 trait TraitAddAssociatedType {
590 #[rustc_dirty(label="Hir", cfg="cfail2")]
591 #[rustc_clean(label="Hir", cfg="cfail3")]
592 #[rustc_metadata_dirty(cfg="cfail2")]
593 #[rustc_metadata_clean(cfg="cfail3")]
594 trait TraitAddAssociatedType {
602 // Add trait bound to associated type ---------------------------------------------
604 trait TraitAddTraitBoundToAssociatedType {
611 #[rustc_clean(label="Hir", cfg="cfail2")]
612 #[rustc_clean(label="Hir", cfg="cfail3")]
613 #[rustc_metadata_dirty(cfg="cfail2")]
614 #[rustc_metadata_clean(cfg="cfail3")]
615 trait TraitAddTraitBoundToAssociatedType {
616 #[rustc_dirty(label="Hir", cfg="cfail2")]
617 #[rustc_clean(label="Hir", cfg="cfail3")]
618 #[rustc_metadata_dirty(cfg="cfail2")]
619 #[rustc_metadata_clean(cfg="cfail3")]
620 type Associated: ReferencedTrait0;
627 // Add lifetime bound to associated type ------------------------------------------
629 trait TraitAddLifetimeBoundToAssociatedType<'a> {
636 #[rustc_clean(label="Hir", cfg="cfail2")]
637 #[rustc_clean(label="Hir", cfg="cfail3")]
638 #[rustc_metadata_dirty(cfg="cfail2")]
639 #[rustc_metadata_clean(cfg="cfail3")]
640 trait TraitAddLifetimeBoundToAssociatedType<'a> {
641 #[rustc_dirty(label="Hir", cfg="cfail2")]
642 #[rustc_clean(label="Hir", cfg="cfail3")]
643 #[rustc_metadata_dirty(cfg="cfail2")]
644 #[rustc_metadata_clean(cfg="cfail3")]
652 // Add default to associated type -------------------------------------------------
654 trait TraitAddDefaultToAssociatedType {
661 #[rustc_dirty(label="Hir", cfg="cfail2")]
662 #[rustc_clean(label="Hir", cfg="cfail3")]
663 #[rustc_metadata_dirty(cfg="cfail2")]
664 #[rustc_metadata_clean(cfg="cfail3")]
665 trait TraitAddDefaultToAssociatedType {
666 type Associated = ReferenceType0;
673 // Add associated constant --------------------------------------------------------
675 trait TraitAddAssociatedConstant {
680 #[rustc_dirty(label="Hir", cfg="cfail2")]
681 #[rustc_clean(label="Hir", cfg="cfail3")]
682 #[rustc_metadata_dirty(cfg="cfail2")]
683 #[rustc_metadata_clean(cfg="cfail3")]
684 trait TraitAddAssociatedConstant {
692 // Add initializer to associated constant -----------------------------------------
694 trait TraitAddInitializerToAssociatedConstant {
701 #[rustc_dirty(label="Hir", cfg="cfail2")]
702 #[rustc_clean(label="Hir", cfg="cfail3")]
703 #[rustc_metadata_dirty(cfg="cfail2")]
704 #[rustc_metadata_clean(cfg="cfail3")]
705 trait TraitAddInitializerToAssociatedConstant {
706 const Value: u32 = 1;
713 // Change type of associated constant ---------------------------------------------
715 trait TraitChangeTypeOfAssociatedConstant {
722 #[rustc_clean(label="Hir", cfg="cfail2")]
723 #[rustc_clean(label="Hir", cfg="cfail3")]
724 #[rustc_metadata_dirty(cfg="cfail2")]
725 #[rustc_metadata_clean(cfg="cfail3")]
726 trait TraitChangeTypeOfAssociatedConstant {
727 #[rustc_dirty(label="Hir", cfg="cfail2")]
728 #[rustc_clean(label="Hir", cfg="cfail3")]
729 #[rustc_metadata_dirty(cfg="cfail2")]
730 #[rustc_metadata_clean(cfg="cfail3")]
738 // Add super trait ----------------------------------------------------------------
740 trait TraitAddSuperTrait { }
743 #[rustc_dirty(label="Hir", cfg="cfail2")]
744 #[rustc_clean(label="Hir", cfg="cfail3")]
745 #[rustc_metadata_dirty(cfg="cfail2")]
746 #[rustc_metadata_clean(cfg="cfail3")]
747 trait TraitAddSuperTrait : ReferencedTrait0 { }
751 // Add builtin bound (Send or Copy) -----------------------------------------------
753 trait TraitAddBuiltiBound { }
756 #[rustc_dirty(label="Hir", cfg="cfail2")]
757 #[rustc_clean(label="Hir", cfg="cfail3")]
758 #[rustc_metadata_dirty(cfg="cfail2")]
759 #[rustc_metadata_clean(cfg="cfail3")]
760 trait TraitAddBuiltiBound : Send { }
764 // Add 'static lifetime bound to trait --------------------------------------------
766 trait TraitAddStaticLifetimeBound { }
769 #[rustc_dirty(label="Hir", cfg="cfail2")]
770 #[rustc_clean(label="Hir", cfg="cfail3")]
771 #[rustc_metadata_dirty(cfg="cfail2")]
772 #[rustc_metadata_clean(cfg="cfail3")]
773 trait TraitAddStaticLifetimeBound : 'static { }
777 // Add super trait as second bound ------------------------------------------------
779 trait TraitAddTraitAsSecondBound : ReferencedTrait0 { }
782 #[rustc_dirty(label="Hir", cfg="cfail2")]
783 #[rustc_clean(label="Hir", cfg="cfail3")]
784 #[rustc_metadata_dirty(cfg="cfail2")]
785 #[rustc_metadata_clean(cfg="cfail3")]
786 trait TraitAddTraitAsSecondBound : ReferencedTrait0 + ReferencedTrait1 { }
789 trait TraitAddTraitAsSecondBoundFromBuiltin : Send { }
792 #[rustc_dirty(label="Hir", cfg="cfail2")]
793 #[rustc_clean(label="Hir", cfg="cfail3")]
794 #[rustc_metadata_dirty(cfg="cfail2")]
795 #[rustc_metadata_clean(cfg="cfail3")]
796 trait TraitAddTraitAsSecondBoundFromBuiltin : Send + ReferencedTrait0 { }
800 // Add builtin bound as second bound ----------------------------------------------
802 trait TraitAddBuiltinBoundAsSecondBound : ReferencedTrait0 { }
805 #[rustc_dirty(label="Hir", cfg="cfail2")]
806 #[rustc_clean(label="Hir", cfg="cfail3")]
807 #[rustc_metadata_dirty(cfg="cfail2")]
808 #[rustc_metadata_clean(cfg="cfail3")]
809 trait TraitAddBuiltinBoundAsSecondBound : ReferencedTrait0 + Send { }
812 trait TraitAddBuiltinBoundAsSecondBoundFromBuiltin : Send { }
815 #[rustc_dirty(label="Hir", cfg="cfail2")]
816 #[rustc_clean(label="Hir", cfg="cfail3")]
817 #[rustc_metadata_dirty(cfg="cfail2")]
818 #[rustc_metadata_clean(cfg="cfail3")]
819 trait TraitAddBuiltinBoundAsSecondBoundFromBuiltin: Send + Copy { }
823 // Add 'static bounds as second bound ---------------------------------------------
825 trait TraitAddStaticBoundAsSecondBound : ReferencedTrait0 { }
828 #[rustc_dirty(label="Hir", cfg="cfail2")]
829 #[rustc_clean(label="Hir", cfg="cfail3")]
830 #[rustc_metadata_dirty(cfg="cfail2")]
831 #[rustc_metadata_clean(cfg="cfail3")]
832 trait TraitAddStaticBoundAsSecondBound : ReferencedTrait0 + 'static { }
835 trait TraitAddStaticBoundAsSecondBoundFromBuiltin : Send { }
838 #[rustc_dirty(label="Hir", cfg="cfail2")]
839 #[rustc_clean(label="Hir", cfg="cfail3")]
840 #[rustc_metadata_dirty(cfg="cfail2")]
841 #[rustc_metadata_clean(cfg="cfail3")]
842 trait TraitAddStaticBoundAsSecondBoundFromBuiltin : Send + 'static { }
846 // Add type parameter to trait ----------------------------------------------------
848 trait TraitAddTypeParameterToTrait { }
851 #[rustc_dirty(label="Hir", cfg="cfail2")]
852 #[rustc_clean(label="Hir", cfg="cfail3")]
853 #[rustc_metadata_dirty(cfg="cfail2")]
854 #[rustc_metadata_clean(cfg="cfail3")]
855 trait TraitAddTypeParameterToTrait<T> { }
859 // Add lifetime parameter to trait ------------------------------------------------
861 trait TraitAddLifetimeParameterToTrait { }
864 #[rustc_dirty(label="Hir", cfg="cfail2")]
865 #[rustc_clean(label="Hir", cfg="cfail3")]
866 #[rustc_metadata_dirty(cfg="cfail2")]
867 #[rustc_metadata_clean(cfg="cfail3")]
868 trait TraitAddLifetimeParameterToTrait<'a> { }
872 // Add trait bound to type parameter of trait -------------------------------------
874 trait TraitAddTraitBoundToTypeParameterOfTrait<T> { }
877 #[rustc_dirty(label="Hir", cfg="cfail2")]
878 #[rustc_clean(label="Hir", cfg="cfail3")]
879 #[rustc_metadata_dirty(cfg="cfail2")]
880 #[rustc_metadata_clean(cfg="cfail3")]
881 trait TraitAddTraitBoundToTypeParameterOfTrait<T: ReferencedTrait0> { }
885 // Add lifetime bound to type parameter of trait ----------------------------------
887 trait TraitAddLifetimeBoundToTypeParameterOfTrait<'a, T> { }
890 #[rustc_dirty(label="Hir", cfg="cfail2")]
891 #[rustc_clean(label="Hir", cfg="cfail3")]
892 #[rustc_metadata_dirty(cfg="cfail2")]
893 #[rustc_metadata_clean(cfg="cfail3")]
894 trait TraitAddLifetimeBoundToTypeParameterOfTrait<'a, T: 'a> { }
898 // Add lifetime bound to lifetime parameter of trait ------------------------------
900 trait TraitAddLifetimeBoundToLifetimeParameterOfTrait<'a, 'b> { }
903 #[rustc_dirty(label="Hir", cfg="cfail2")]
904 #[rustc_clean(label="Hir", cfg="cfail3")]
905 #[rustc_metadata_dirty(cfg="cfail2")]
906 #[rustc_metadata_clean(cfg="cfail3")]
907 trait TraitAddLifetimeBoundToLifetimeParameterOfTrait<'a: 'b, 'b> { }
911 // Add builtin bound to type parameter of trait -----------------------------------
913 trait TraitAddBuiltinBoundToTypeParameterOfTrait<T> { }
916 #[rustc_dirty(label="Hir", cfg="cfail2")]
917 #[rustc_clean(label="Hir", cfg="cfail3")]
918 #[rustc_metadata_dirty(cfg="cfail2")]
919 #[rustc_metadata_clean(cfg="cfail3")]
920 trait TraitAddBuiltinBoundToTypeParameterOfTrait<T: Send> { }
924 // Add second type parameter to trait ---------------------------------------------
926 trait TraitAddSecondTypeParameterToTrait<T> { }
929 #[rustc_dirty(label="Hir", cfg="cfail2")]
930 #[rustc_clean(label="Hir", cfg="cfail3")]
931 #[rustc_metadata_dirty(cfg="cfail2")]
932 #[rustc_metadata_clean(cfg="cfail3")]
933 trait TraitAddSecondTypeParameterToTrait<T, S> { }
937 // Add second lifetime parameter to trait -----------------------------------------
939 trait TraitAddSecondLifetimeParameterToTrait<'a> { }
942 #[rustc_dirty(label="Hir", cfg="cfail2")]
943 #[rustc_clean(label="Hir", cfg="cfail3")]
944 #[rustc_metadata_dirty(cfg="cfail2")]
945 #[rustc_metadata_clean(cfg="cfail3")]
946 trait TraitAddSecondLifetimeParameterToTrait<'a, 'b> { }
950 // Add second trait bound to type parameter of trait ------------------------------
952 trait TraitAddSecondTraitBoundToTypeParameterOfTrait<T: ReferencedTrait0> { }
955 #[rustc_dirty(label="Hir", cfg="cfail2")]
956 #[rustc_clean(label="Hir", cfg="cfail3")]
957 #[rustc_metadata_dirty(cfg="cfail2")]
958 #[rustc_metadata_clean(cfg="cfail3")]
959 trait TraitAddSecondTraitBoundToTypeParameterOfTrait<T: ReferencedTrait0 + ReferencedTrait1> { }
963 // Add second lifetime bound to type parameter of trait ---------------------------
965 trait TraitAddSecondLifetimeBoundToTypeParameterOfTrait<'a, 'b, T: 'a> { }
968 #[rustc_dirty(label="Hir", cfg="cfail2")]
969 #[rustc_clean(label="Hir", cfg="cfail3")]
970 #[rustc_metadata_dirty(cfg="cfail2")]
971 #[rustc_metadata_clean(cfg="cfail3")]
972 trait TraitAddSecondLifetimeBoundToTypeParameterOfTrait<'a, 'b, T: 'a + 'b> { }
976 // Add second lifetime bound to lifetime parameter of trait------------------------
978 trait TraitAddSecondLifetimeBoundToLifetimeParameterOfTrait<'a: 'b, 'b, 'c> { }
981 #[rustc_dirty(label="Hir", cfg="cfail2")]
982 #[rustc_clean(label="Hir", cfg="cfail3")]
983 #[rustc_metadata_dirty(cfg="cfail2")]
984 #[rustc_metadata_clean(cfg="cfail3")]
985 trait TraitAddSecondLifetimeBoundToLifetimeParameterOfTrait<'a: 'b + 'c, 'b, 'c> { }
989 // Add second builtin bound to type parameter of trait ----------------------------
991 trait TraitAddSecondBuiltinBoundToTypeParameterOfTrait<T: Send> { }
994 #[rustc_dirty(label="Hir", cfg="cfail2")]
995 #[rustc_clean(label="Hir", cfg="cfail3")]
996 #[rustc_metadata_dirty(cfg="cfail2")]
997 #[rustc_metadata_clean(cfg="cfail3")]
998 trait TraitAddSecondBuiltinBoundToTypeParameterOfTrait<T: Send + Sync> { }
1002 // --------------------------------------------------------------------------------
1003 struct ReferenceType0 {}
1004 struct ReferenceType1 {}
1008 // Add trait bound to type parameter of trait in where clause----------------------
1010 trait TraitAddTraitBoundToTypeParameterOfTraitWhere<T> { }
1013 #[rustc_dirty(label="Hir", cfg="cfail2")]
1014 #[rustc_clean(label="Hir", cfg="cfail3")]
1015 #[rustc_metadata_dirty(cfg="cfail2")]
1016 #[rustc_metadata_clean(cfg="cfail3")]
1017 trait TraitAddTraitBoundToTypeParameterOfTraitWhere<T> where T: ReferencedTrait0 { }
1021 // Add lifetime bound to type parameter of trait in where clause-------------------
1023 trait TraitAddLifetimeBoundToTypeParameterOfTraitWhere<'a, T> { }
1026 #[rustc_dirty(label="Hir", cfg="cfail2")]
1027 #[rustc_clean(label="Hir", cfg="cfail3")]
1028 #[rustc_metadata_dirty(cfg="cfail2")]
1029 #[rustc_metadata_clean(cfg="cfail3")]
1030 trait TraitAddLifetimeBoundToTypeParameterOfTraitWhere<'a, T> where T: 'a { }
1034 // Add lifetime bound to lifetime parameter of trait in where clause---------------
1036 trait TraitAddLifetimeBoundToLifetimeParameterOfTraitWhere<'a, 'b> { }
1039 #[rustc_dirty(label="Hir", cfg="cfail2")]
1040 #[rustc_clean(label="Hir", cfg="cfail3")]
1041 #[rustc_metadata_dirty(cfg="cfail2")]
1042 #[rustc_metadata_clean(cfg="cfail3")]
1043 trait TraitAddLifetimeBoundToLifetimeParameterOfTraitWhere<'a, 'b> where 'a: 'b { }
1047 // Add builtin bound to type parameter of trait in where clause--------------------
1049 trait TraitAddBuiltinBoundToTypeParameterOfTraitWhere<T> { }
1052 #[rustc_dirty(label="Hir", cfg="cfail2")]
1053 #[rustc_clean(label="Hir", cfg="cfail3")]
1054 #[rustc_metadata_dirty(cfg="cfail2")]
1055 #[rustc_metadata_clean(cfg="cfail3")]
1056 trait TraitAddBuiltinBoundToTypeParameterOfTraitWhere<T> where T: Send { }
1060 // Add second trait bound to type parameter of trait in where clause---------------
1062 trait TraitAddSecondTraitBoundToTypeParameterOfTraitWhere<T> where T: ReferencedTrait0 { }
1065 #[rustc_dirty(label="Hir", cfg="cfail2")]
1066 #[rustc_clean(label="Hir", cfg="cfail3")]
1067 #[rustc_metadata_dirty(cfg="cfail2")]
1068 #[rustc_metadata_clean(cfg="cfail3")]
1069 trait TraitAddSecondTraitBoundToTypeParameterOfTraitWhere<T>
1070 where T: ReferencedTrait0 + ReferencedTrait1 { }
1074 // Add second lifetime bound to type parameter of trait in where clause------------
1076 trait TraitAddSecondLifetimeBoundToTypeParameterOfTraitWhere<'a, 'b, T> where T: 'a { }
1079 #[rustc_dirty(label="Hir", cfg="cfail2")]
1080 #[rustc_clean(label="Hir", cfg="cfail3")]
1081 #[rustc_metadata_dirty(cfg="cfail2")]
1082 #[rustc_metadata_clean(cfg="cfail3")]
1083 trait TraitAddSecondLifetimeBoundToTypeParameterOfTraitWhere<'a, 'b, T> where T: 'a + 'b { }
1087 // Add second lifetime bound to lifetime parameter of trait in where clause--------
1089 trait TraitAddSecondLifetimeBoundToLifetimeParameterOfTraitWhere<'a, 'b, 'c> where 'a: 'b { }
1092 #[rustc_dirty(label="Hir", cfg="cfail2")]
1093 #[rustc_clean(label="Hir", cfg="cfail3")]
1094 #[rustc_metadata_dirty(cfg="cfail2")]
1095 #[rustc_metadata_clean(cfg="cfail3")]
1096 trait TraitAddSecondLifetimeBoundToLifetimeParameterOfTraitWhere<'a, 'b, 'c> where 'a: 'b + 'c { }
1100 // Add second builtin bound to type parameter of trait in where clause-------------
1102 trait TraitAddSecondBuiltinBoundToTypeParameterOfTraitWhere<T> where T: Send { }
1105 #[rustc_dirty(label="Hir", cfg="cfail2")]
1106 #[rustc_clean(label="Hir", cfg="cfail3")]
1107 #[rustc_metadata_dirty(cfg="cfail2")]
1108 #[rustc_metadata_clean(cfg="cfail3")]
1109 trait TraitAddSecondBuiltinBoundToTypeParameterOfTraitWhere<T> where T: Send + Sync { }
1113 // EDIT: Some more cases ----------------------------------------------------------
1115 // Change return type of method indirectly by modifying a use statement------------
1116 mod change_return_type_of_method_indirectly_use {
1118 use super::ReferenceType0 as ReturnType;
1120 use super::ReferenceType1 as ReturnType;
1122 #[rustc_clean(label="Hir", cfg="cfail2")]
1123 #[rustc_clean(label="Hir", cfg="cfail3")]
1124 #[rustc_metadata_dirty(cfg="cfail2")]
1125 #[rustc_metadata_clean(cfg="cfail3")]
1126 trait TraitChangeReturnType {
1127 #[rustc_dirty(label="Hir", cfg="cfail2")]
1128 #[rustc_clean(label="Hir", cfg="cfail3")]
1129 #[rustc_metadata_dirty(cfg="cfail2")]
1130 #[rustc_metadata_clean(cfg="cfail3")]
1131 fn method() -> ReturnType;
1137 // Change type of method parameter indirectly by modifying a use statement---------
1138 mod change_method_parameter_type_indirectly_by_use {
1140 use super::ReferenceType0 as ArgType;
1142 use super::ReferenceType1 as ArgType;
1144 #[rustc_clean(label="Hir", cfg="cfail2")]
1145 #[rustc_clean(label="Hir", cfg="cfail3")]
1146 #[rustc_metadata_dirty(cfg="cfail2")]
1147 #[rustc_metadata_clean(cfg="cfail3")]
1148 trait TraitChangeArgType {
1149 #[rustc_dirty(label="Hir", cfg="cfail2")]
1150 #[rustc_clean(label="Hir", cfg="cfail3")]
1151 #[rustc_metadata_dirty(cfg="cfail2")]
1152 #[rustc_metadata_clean(cfg="cfail3")]
1153 fn method(a: ArgType);
1159 // Change trait bound of method type parameter indirectly by modifying a use statement
1160 mod change_method_parameter_type_bound_indirectly_by_use {
1162 use super::ReferencedTrait0 as Bound;
1164 use super::ReferencedTrait1 as Bound;
1166 #[rustc_clean(label="Hir", cfg="cfail2")]
1167 #[rustc_clean(label="Hir", cfg="cfail3")]
1168 #[rustc_metadata_dirty(cfg="cfail2")]
1169 #[rustc_metadata_clean(cfg="cfail3")]
1170 trait TraitChangeBoundOfMethodTypeParameter {
1171 #[rustc_dirty(label="Hir", cfg="cfail2")]
1172 #[rustc_clean(label="Hir", cfg="cfail3")]
1173 #[rustc_metadata_dirty(cfg="cfail2")]
1174 #[rustc_metadata_clean(cfg="cfail3")]
1175 fn method<T: Bound>(a: T);
1181 // Change trait bound of method type parameter in where clause indirectly
1182 // by modifying a use statement
1183 mod change_method_parameter_type_bound_indirectly_by_use_where {
1185 use super::ReferencedTrait0 as Bound;
1187 use super::ReferencedTrait1 as Bound;
1189 #[rustc_clean(label="Hir", cfg="cfail2")]
1190 #[rustc_clean(label="Hir", cfg="cfail3")]
1191 #[rustc_metadata_dirty(cfg="cfail2")]
1192 #[rustc_metadata_clean(cfg="cfail3")]
1193 trait TraitChangeBoundOfMethodTypeParameterWhere {
1194 #[rustc_dirty(label="Hir", cfg="cfail2")]
1195 #[rustc_clean(label="Hir", cfg="cfail3")]
1196 #[rustc_metadata_dirty(cfg="cfail2")]
1197 #[rustc_metadata_clean(cfg="cfail3")]
1198 fn method<T>(a: T) where T: Bound;
1204 // Change trait bound of trait type parameter indirectly by modifying a use statement
1205 mod change_method_type_parameter_bound_indirectly {
1207 use super::ReferencedTrait0 as Bound;
1209 use super::ReferencedTrait1 as Bound;
1211 #[rustc_dirty(label="Hir", cfg="cfail2")]
1212 #[rustc_clean(label="Hir", cfg="cfail3")]
1213 #[rustc_metadata_dirty(cfg="cfail2")]
1214 #[rustc_metadata_clean(cfg="cfail3")]
1215 trait TraitChangeTraitBound<T: Bound> {
1222 // Change trait bound of trait type parameter in where clause indirectly
1223 // by modifying a use statement
1224 mod change_method_type_parameter_bound_indirectly_where {
1226 use super::ReferencedTrait0 as Bound;
1228 use super::ReferencedTrait1 as Bound;
1230 #[rustc_dirty(label="Hir", cfg="cfail2")]
1231 #[rustc_clean(label="Hir", cfg="cfail3")]
1232 #[rustc_metadata_dirty(cfg="cfail2")]
1233 #[rustc_metadata_clean(cfg="cfail3")]
1234 trait TraitChangeTraitBoundWhere<T> where T: Bound {