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 enum 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 enum 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 enum'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)]
34 // Change enum visibility -----------------------------------------------------
36 enum EnumVisibility { A }
39 #[rustc_dirty(label="Hir", cfg="cfail2")]
40 #[rustc_clean(label="Hir", cfg="cfail3")]
41 #[rustc_metadata_dirty(cfg="cfail2")]
42 #[rustc_metadata_clean(cfg="cfail3")]
43 pub enum EnumVisibility {
44 #[rustc_metadata_dirty(cfg="cfail2")]
45 #[rustc_metadata_clean(cfg="cfail3")]
51 // Change name of a c-style variant -------------------------------------------
53 enum EnumChangeNameCStyleVariant {
59 #[rustc_dirty(label="Hir", cfg="cfail2")]
60 #[rustc_clean(label="Hir", cfg="cfail3")]
61 #[rustc_metadata_dirty(cfg="cfail2")]
62 #[rustc_metadata_clean(cfg="cfail3")]
63 enum EnumChangeNameCStyleVariant {
64 #[rustc_metadata_dirty(cfg="cfail2")]
65 #[rustc_metadata_clean(cfg="cfail3")]
67 #[rustc_metadata_clean(cfg="cfail3")]
73 // Change name of a tuple-style variant ---------------------------------------
75 enum EnumChangeNameTupleStyleVariant {
81 #[rustc_dirty(label="Hir", cfg="cfail2")]
82 #[rustc_clean(label="Hir", cfg="cfail3")]
83 #[rustc_metadata_dirty(cfg="cfail2")]
84 #[rustc_metadata_clean(cfg="cfail3")]
85 enum EnumChangeNameTupleStyleVariant {
87 Variant2Changed(u32, f32),
92 // Change name of a struct-style variant --------------------------------------
94 enum EnumChangeNameStructStyleVariant {
96 Variant2 { a: u32, b: f32 },
100 #[rustc_dirty(label="Hir", cfg="cfail2")]
101 #[rustc_clean(label="Hir", cfg="cfail3")]
102 #[rustc_metadata_dirty(cfg="cfail2")]
103 #[rustc_metadata_clean(cfg="cfail3")]
104 enum EnumChangeNameStructStyleVariant {
106 Variant2Changed { a: u32, b: f32 },
111 // Change the value of a c-style variant --------------------------------------
113 enum EnumChangeValueCStyleVariant0 {
119 #[rustc_clean(label="Hir", cfg="cfail2")]
120 #[rustc_clean(label="Hir", cfg="cfail3")]
121 #[rustc_dirty(label="HirBody", cfg="cfail2")]
122 #[rustc_clean(label="HirBody", cfg="cfail3")]
123 #[rustc_metadata_clean(cfg="cfail2")]
124 #[rustc_metadata_clean(cfg="cfail3")]
125 enum EnumChangeValueCStyleVariant0 {
128 #[rustc_metadata_dirty(cfg="cfail2")]
129 #[rustc_metadata_clean(cfg="cfail3")]
134 enum EnumChangeValueCStyleVariant1 {
140 #[rustc_dirty(label="Hir", cfg="cfail2")]
141 #[rustc_clean(label="Hir", cfg="cfail3")]
142 #[rustc_clean(label="HirBody", cfg="cfail2")]
143 #[rustc_clean(label="HirBody", cfg="cfail3")]
144 #[rustc_metadata_dirty(cfg="cfail2")]
145 #[rustc_metadata_clean(cfg="cfail3")]
146 enum EnumChangeValueCStyleVariant1 {
153 // Add a c-style variant ------------------------------------------------------
155 enum EnumAddCStyleVariant {
160 #[rustc_dirty(label="Hir", cfg="cfail2")]
161 #[rustc_clean(label="Hir", cfg="cfail3")]
162 #[rustc_metadata_dirty(cfg="cfail2")]
163 #[rustc_metadata_clean(cfg="cfail3")]
164 enum EnumAddCStyleVariant {
171 // Remove a c-style variant ---------------------------------------------------
173 enum EnumRemoveCStyleVariant {
179 #[rustc_dirty(label="Hir", cfg="cfail2")]
180 #[rustc_clean(label="Hir", cfg="cfail3")]
181 #[rustc_metadata_dirty(cfg="cfail2")]
182 #[rustc_metadata_clean(cfg="cfail3")]
183 enum EnumRemoveCStyleVariant {
189 // Add a tuple-style variant --------------------------------------------------
191 enum EnumAddTupleStyleVariant {
196 #[rustc_dirty(label="Hir", cfg="cfail2")]
197 #[rustc_clean(label="Hir", cfg="cfail3")]
198 #[rustc_metadata_dirty(cfg="cfail2")]
199 #[rustc_metadata_clean(cfg="cfail3")]
200 enum EnumAddTupleStyleVariant {
207 // Remove a tuple-style variant -----------------------------------------------
209 enum EnumRemoveTupleStyleVariant {
215 #[rustc_dirty(label="Hir", cfg="cfail2")]
216 #[rustc_clean(label="Hir", cfg="cfail3")]
217 #[rustc_metadata_dirty(cfg="cfail2")]
218 #[rustc_metadata_clean(cfg="cfail3")]
219 enum EnumRemoveTupleStyleVariant {
225 // Add a struct-style variant -------------------------------------------------
227 enum EnumAddStructStyleVariant {
232 #[rustc_dirty(label="Hir", cfg="cfail2")]
233 #[rustc_clean(label="Hir", cfg="cfail3")]
234 #[rustc_metadata_dirty(cfg="cfail2")]
235 #[rustc_metadata_clean(cfg="cfail3")]
236 enum EnumAddStructStyleVariant {
238 Variant2 { a: u32, b: f32 },
243 // Remove a struct-style variant ----------------------------------------------
245 enum EnumRemoveStructStyleVariant {
247 Variant2 { a: u32, b: f32 },
251 #[rustc_dirty(label="Hir", cfg="cfail2")]
252 #[rustc_clean(label="Hir", cfg="cfail3")]
253 #[rustc_metadata_dirty(cfg="cfail2")]
254 #[rustc_metadata_clean(cfg="cfail3")]
255 enum EnumRemoveStructStyleVariant {
261 // Change the type of a field in a tuple-style variant ------------------------
263 enum EnumChangeFieldTypeTupleStyleVariant {
268 #[rustc_dirty(label="Hir", cfg="cfail2")]
269 #[rustc_clean(label="Hir", cfg="cfail3")]
270 #[rustc_metadata_clean(cfg="cfail2")]
271 #[rustc_metadata_clean(cfg="cfail3")]
272 enum EnumChangeFieldTypeTupleStyleVariant {
274 #[rustc_metadata_dirty(cfg="cfail2")]
275 #[rustc_metadata_clean(cfg="cfail3")]
281 // Change the type of a field in a struct-style variant -----------------------
283 enum EnumChangeFieldTypeStructStyleVariant {
285 Variant2 { a: u32, b: u32 },
289 #[rustc_dirty(label="Hir", cfg="cfail2")]
290 #[rustc_clean(label="Hir", cfg="cfail3")]
291 #[rustc_metadata_clean(cfg="cfail2")]
292 #[rustc_metadata_clean(cfg="cfail3")]
293 enum EnumChangeFieldTypeStructStyleVariant {
297 #[rustc_metadata_dirty(cfg="cfail2")]
298 #[rustc_metadata_clean(cfg="cfail3")]
305 // Change the name of a field in a struct-style variant -----------------------
307 enum EnumChangeFieldNameStructStyleVariant {
308 Variant1 { a: u32, b: u32 },
312 #[rustc_dirty(label="Hir", cfg="cfail2")]
313 #[rustc_clean(label="Hir", cfg="cfail3")]
314 #[rustc_metadata_dirty(cfg="cfail2")]
315 #[rustc_metadata_clean(cfg="cfail3")]
316 enum EnumChangeFieldNameStructStyleVariant {
317 Variant1 { a: u32, c: u32 },
322 // Change order of fields in a tuple-style variant ----------------------------
324 enum EnumChangeOrderTupleStyleVariant {
329 #[rustc_dirty(label="Hir", cfg="cfail2")]
330 #[rustc_clean(label="Hir", cfg="cfail3")]
331 #[rustc_metadata_clean(cfg="cfail2")]
332 #[rustc_metadata_clean(cfg="cfail3")]
333 enum EnumChangeOrderTupleStyleVariant {
335 #[rustc_metadata_dirty(cfg="cfail2")]
336 #[rustc_metadata_clean(cfg="cfail3")]
338 #[rustc_metadata_dirty(cfg="cfail2")]
339 #[rustc_metadata_clean(cfg="cfail3")]
345 // Change order of fields in a struct-style variant ---------------------------
347 enum EnumChangeFieldOrderStructStyleVariant {
348 Variant1 { a: u32, b: f32 },
352 #[rustc_dirty(label="Hir", cfg="cfail2")]
353 #[rustc_clean(label="Hir", cfg="cfail3")]
354 #[rustc_metadata_dirty(cfg="cfail2")]
355 #[rustc_metadata_clean(cfg="cfail3")]
356 enum EnumChangeFieldOrderStructStyleVariant {
357 Variant1 { b: f32, a: u32 },
362 // Add a field to a tuple-style variant ---------------------------------------
364 enum EnumAddFieldTupleStyleVariant {
369 #[rustc_dirty(label="Hir", cfg="cfail2")]
370 #[rustc_clean(label="Hir", cfg="cfail3")]
371 #[rustc_metadata_dirty(cfg="cfail2")]
372 #[rustc_metadata_clean(cfg="cfail3")]
373 enum EnumAddFieldTupleStyleVariant {
374 Variant1(u32, u32, u32),
379 // Add a field to a struct-style variant --------------------------------------
381 enum EnumAddFieldStructStyleVariant {
382 Variant1 { a: u32, b: u32 },
386 #[rustc_dirty(label="Hir", cfg="cfail2")]
387 #[rustc_clean(label="Hir", cfg="cfail3")]
388 #[rustc_metadata_dirty(cfg="cfail2")]
389 #[rustc_metadata_clean(cfg="cfail3")]
390 enum EnumAddFieldStructStyleVariant {
391 Variant1 { a: u32, b: u32, c: u32 },
396 // Add #[must_use] to the enum ------------------------------------------------
398 enum EnumAddMustUse {
404 #[rustc_dirty(label="Hir", cfg="cfail2")]
405 #[rustc_clean(label="Hir", cfg="cfail3")]
406 #[rustc_metadata_dirty(cfg="cfail2")]
407 #[rustc_metadata_clean(cfg="cfail3")]
409 enum EnumAddMustUse {
416 // Add #[repr(C)] to the enum -------------------------------------------------
424 #[rustc_dirty(label="Hir", cfg="cfail2")]
425 #[rustc_clean(label="Hir", cfg="cfail3")]
426 #[rustc_metadata_dirty(cfg="cfail2")]
427 #[rustc_metadata_clean(cfg="cfail3")]
436 // Change the name of a type parameter ----------------------------------------
438 enum EnumChangeNameOfTypeParameter<S> {
443 #[rustc_dirty(label="Hir", cfg="cfail2")]
444 #[rustc_clean(label="Hir", cfg="cfail3")]
445 #[rustc_metadata_dirty(cfg="cfail2")]
446 #[rustc_metadata_clean(cfg="cfail3")]
448 enum EnumChangeNameOfTypeParameter<T> {
454 // Add a type parameter ------------------------------------------------------
456 enum EnumAddTypeParameter<S> {
462 #[rustc_dirty(label="Hir", cfg="cfail2")]
463 #[rustc_clean(label="Hir", cfg="cfail3")]
464 #[rustc_metadata_dirty(cfg="cfail2")]
465 #[rustc_metadata_clean(cfg="cfail3")]
467 enum EnumAddTypeParameter<S, T> {
474 // Change the name of a lifetime parameter ------------------------------------
476 enum EnumChangeNameOfLifetimeParameter<'a> {
481 #[rustc_dirty(label="Hir", cfg="cfail2")]
482 #[rustc_clean(label="Hir", cfg="cfail3")]
483 #[rustc_metadata_dirty(cfg="cfail2")]
484 #[rustc_metadata_clean(cfg="cfail3")]
486 enum EnumChangeNameOfLifetimeParameter<'b> {
492 // Add a lifetime parameter ---------------------------------------------------
494 enum EnumAddLifetimeParameter<'a> {
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")]
505 enum EnumAddLifetimeParameter<'a, 'b> {
512 // Add a lifetime bound to a lifetime parameter -------------------------------
514 enum EnumAddLifetimeParameterBound<'a, 'b> {
520 #[rustc_dirty(label="Hir", cfg="cfail2")]
521 #[rustc_clean(label="Hir", cfg="cfail3")]
522 #[rustc_metadata_dirty(cfg="cfail2")]
523 #[rustc_metadata_clean(cfg="cfail3")]
525 enum EnumAddLifetimeParameterBound<'a, 'b: 'a> {
530 // Add a lifetime bound to a type parameter -----------------------------------
532 enum EnumAddLifetimeBoundToParameter<'a, T> {
538 #[rustc_dirty(label="Hir", cfg="cfail2")]
539 #[rustc_clean(label="Hir", cfg="cfail3")]
540 #[rustc_metadata_dirty(cfg="cfail2")]
541 #[rustc_metadata_clean(cfg="cfail3")]
543 enum EnumAddLifetimeBoundToParameter<'a, T: 'a> {
550 // Add a trait bound to a type parameter --------------------------------------
552 enum EnumAddTraitBound<S> {
557 #[rustc_dirty(label="Hir", cfg="cfail2")]
558 #[rustc_clean(label="Hir", cfg="cfail3")]
559 #[rustc_metadata_dirty(cfg="cfail2")]
560 #[rustc_metadata_clean(cfg="cfail3")]
562 enum EnumAddTraitBound<T: Sync> {
568 // Add a lifetime bound to a lifetime parameter in where clause ---------------
570 enum EnumAddLifetimeParameterBoundWhere<'a, 'b> {
576 #[rustc_dirty(label="Hir", cfg="cfail2")]
577 #[rustc_clean(label="Hir", cfg="cfail3")]
578 #[rustc_metadata_dirty(cfg="cfail2")]
579 #[rustc_metadata_clean(cfg="cfail3")]
581 enum EnumAddLifetimeParameterBoundWhere<'a, 'b> where 'b: 'a {
588 // Add a lifetime bound to a type parameter in where clause -------------------
590 enum EnumAddLifetimeBoundToParameterWhere<'a, T> {
596 #[rustc_dirty(label="Hir", cfg="cfail2")]
597 #[rustc_clean(label="Hir", cfg="cfail3")]
598 #[rustc_metadata_dirty(cfg="cfail2")]
599 #[rustc_metadata_clean(cfg="cfail3")]
601 enum EnumAddLifetimeBoundToParameterWhere<'a, T> where T: 'a {
608 // Add a trait bound to a type parameter in where clause ----------------------
610 enum EnumAddTraitBoundWhere<S> {
615 #[rustc_dirty(label="Hir", cfg="cfail2")]
616 #[rustc_clean(label="Hir", cfg="cfail3")]
617 #[rustc_metadata_dirty(cfg="cfail2")]
618 #[rustc_metadata_clean(cfg="cfail3")]
620 enum EnumAddTraitBoundWhere<T> where T: Sync {
626 // In an enum with two variants, swap usage of type parameters ----------------
628 enum EnumSwapUsageTypeParameters<A, B> {
634 #[rustc_dirty(label="Hir", cfg="cfail2")]
635 #[rustc_clean(label="Hir", cfg="cfail3")]
636 #[rustc_metadata_clean(cfg="cfail2")]
637 #[rustc_metadata_clean(cfg="cfail3")]
638 enum EnumSwapUsageTypeParameters<A, B> {
639 #[rustc_metadata_clean(cfg="cfail2")]
640 #[rustc_metadata_clean(cfg="cfail3")]
642 #[rustc_metadata_dirty(cfg="cfail2")]
643 #[rustc_metadata_clean(cfg="cfail3")]
646 #[rustc_metadata_clean(cfg="cfail2")]
647 #[rustc_metadata_clean(cfg="cfail3")]
649 #[rustc_metadata_dirty(cfg="cfail2")]
650 #[rustc_metadata_clean(cfg="cfail3")]
657 // In an enum with two variants, swap usage of lifetime parameters ------------
659 enum EnumSwapUsageLifetimeParameters<'a, 'b> {
660 Variant1 { a: &'a u32 },
661 Variant2 { b: &'b u32 },
665 #[rustc_dirty(label="Hir", cfg="cfail2")]
666 #[rustc_clean(label="Hir", cfg="cfail3")]
667 #[rustc_metadata_clean(cfg="cfail2")]
668 #[rustc_metadata_clean(cfg="cfail3")]
669 enum EnumSwapUsageLifetimeParameters<'a, 'b> {
670 #[rustc_metadata_clean(cfg="cfail2")]
671 #[rustc_metadata_clean(cfg="cfail3")]
673 #[rustc_metadata_dirty(cfg="cfail2")]
674 #[rustc_metadata_clean(cfg="cfail3")]
677 #[rustc_metadata_clean(cfg="cfail2")]
678 #[rustc_metadata_clean(cfg="cfail3")]
680 #[rustc_metadata_dirty(cfg="cfail2")]
681 #[rustc_metadata_clean(cfg="cfail3")]
688 struct ReferencedType1;
689 struct ReferencedType2;
693 // Change field type in tuple-style variant indirectly by modifying a use statement
694 mod change_field_type_indirectly_tuple_style {
696 use super::ReferencedType1 as FieldType;
698 use super::ReferencedType2 as FieldType;
700 #[rustc_dirty(label="Hir", cfg="cfail2")]
701 #[rustc_clean(label="Hir", cfg="cfail3")]
702 #[rustc_metadata_clean(cfg="cfail2")]
703 #[rustc_metadata_clean(cfg="cfail3")]
705 #[rustc_metadata_dirty(cfg="cfail2")]
706 #[rustc_metadata_clean(cfg="cfail3")]
708 #[rustc_metadata_dirty(cfg="cfail2")]
709 #[rustc_metadata_clean(cfg="cfail3")]
717 // Change field type in record-style variant indirectly by modifying a use statement
718 mod change_field_type_indirectly_struct_style {
720 use super::ReferencedType1 as FieldType;
722 use super::ReferencedType2 as FieldType;
724 #[rustc_dirty(label="Hir", cfg="cfail2")]
725 #[rustc_clean(label="Hir", cfg="cfail3")]
726 #[rustc_metadata_clean(cfg="cfail2")]
727 #[rustc_metadata_clean(cfg="cfail3")]
729 #[rustc_metadata_clean(cfg="cfail2")]
730 #[rustc_metadata_clean(cfg="cfail3")]
732 #[rustc_metadata_dirty(cfg="cfail2")]
733 #[rustc_metadata_clean(cfg="cfail3")]
741 trait ReferencedTrait1 {}
742 trait ReferencedTrait2 {}
746 // Change trait bound of type parameter indirectly by modifying a use statement
747 mod change_trait_bound_indirectly {
749 use super::ReferencedTrait1 as Trait;
751 use super::ReferencedTrait2 as Trait;
753 #[rustc_dirty(label="Hir", cfg="cfail2")]
754 #[rustc_clean(label="Hir", cfg="cfail3")]
755 #[rustc_metadata_dirty(cfg="cfail2")]
756 #[rustc_metadata_clean(cfg="cfail3")]
757 enum Enum<T: Trait> {
764 // Change trait bound of type parameter in where clause indirectly by modifying a use statement
765 mod change_trait_bound_indirectly_where {
767 use super::ReferencedTrait1 as Trait;
769 use super::ReferencedTrait2 as Trait;
771 #[rustc_dirty(label="Hir", cfg="cfail2")]
772 #[rustc_clean(label="Hir", cfg="cfail3")]
773 #[rustc_metadata_dirty(cfg="cfail2")]
774 #[rustc_metadata_clean(cfg="cfail3")]
775 enum Enum<T> where T: Trait {