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_clean(cfg="cfail3")]
42 pub enum EnumVisibility { A }
46 // Change name of a c-style variant -------------------------------------------
48 enum EnumChangeNameCStyleVariant {
54 #[rustc_dirty(label="Hir", cfg="cfail2")]
55 #[rustc_clean(label="Hir", cfg="cfail3")]
56 #[rustc_metadata_dirty(cfg="cfail2")]
57 #[rustc_metadata_clean(cfg="cfail3")]
58 enum EnumChangeNameCStyleVariant {
65 // Change name of a tuple-style variant ---------------------------------------
67 enum EnumChangeNameTupleStyleVariant {
73 #[rustc_dirty(label="Hir", cfg="cfail2")]
74 #[rustc_clean(label="Hir", cfg="cfail3")]
75 #[rustc_metadata_dirty(cfg="cfail2")]
76 #[rustc_metadata_clean(cfg="cfail3")]
77 enum EnumChangeNameTupleStyleVariant {
79 Variant2Changed(u32, f32),
84 // Change name of a struct-style variant --------------------------------------
86 enum EnumChangeNameStructStyleVariant {
88 Variant2 { a: u32, b: f32 },
92 #[rustc_dirty(label="Hir", cfg="cfail2")]
93 #[rustc_clean(label="Hir", cfg="cfail3")]
94 #[rustc_metadata_dirty(cfg="cfail2")]
95 #[rustc_metadata_clean(cfg="cfail3")]
96 enum EnumChangeNameStructStyleVariant {
98 Variant2Changed { a: u32, b: f32 },
103 // Change the value of a c-style variant --------------------------------------
105 enum EnumChangeValueCStyleVariant0 {
111 #[rustc_clean(label="Hir", cfg="cfail2")]
112 #[rustc_clean(label="Hir", cfg="cfail3")]
113 #[rustc_dirty(label="HirBody", cfg="cfail2")]
114 #[rustc_clean(label="HirBody", cfg="cfail3")]
115 #[rustc_metadata_dirty(cfg="cfail2")]
116 #[rustc_metadata_clean(cfg="cfail3")]
117 enum EnumChangeValueCStyleVariant0 {
123 enum EnumChangeValueCStyleVariant1 {
129 #[rustc_dirty(label="Hir", cfg="cfail2")]
130 #[rustc_clean(label="Hir", cfg="cfail3")]
131 #[rustc_clean(label="HirBody", cfg="cfail2")]
132 #[rustc_clean(label="HirBody", cfg="cfail3")]
133 #[rustc_metadata_dirty(cfg="cfail2")]
134 #[rustc_metadata_clean(cfg="cfail3")]
135 enum EnumChangeValueCStyleVariant1 {
142 // Add a c-style variant ------------------------------------------------------
144 enum EnumAddCStyleVariant {
149 #[rustc_dirty(label="Hir", cfg="cfail2")]
150 #[rustc_clean(label="Hir", cfg="cfail3")]
151 #[rustc_metadata_dirty(cfg="cfail2")]
152 #[rustc_metadata_clean(cfg="cfail3")]
153 enum EnumAddCStyleVariant {
160 // Remove a c-style variant ---------------------------------------------------
162 enum EnumRemoveCStyleVariant {
168 #[rustc_dirty(label="Hir", cfg="cfail2")]
169 #[rustc_clean(label="Hir", cfg="cfail3")]
170 #[rustc_metadata_dirty(cfg="cfail2")]
171 #[rustc_metadata_clean(cfg="cfail3")]
172 enum EnumRemoveCStyleVariant {
178 // Add a tuple-style variant --------------------------------------------------
180 enum EnumAddTupleStyleVariant {
185 #[rustc_dirty(label="Hir", cfg="cfail2")]
186 #[rustc_clean(label="Hir", cfg="cfail3")]
187 #[rustc_metadata_dirty(cfg="cfail2")]
188 #[rustc_metadata_clean(cfg="cfail3")]
189 enum EnumAddTupleStyleVariant {
196 // Remove a tuple-style variant -----------------------------------------------
198 enum EnumRemoveTupleStyleVariant {
204 #[rustc_dirty(label="Hir", cfg="cfail2")]
205 #[rustc_clean(label="Hir", cfg="cfail3")]
206 #[rustc_metadata_dirty(cfg="cfail2")]
207 #[rustc_metadata_clean(cfg="cfail3")]
208 enum EnumRemoveTupleStyleVariant {
214 // Add a struct-style variant -------------------------------------------------
216 enum EnumAddStructStyleVariant {
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 enum EnumAddStructStyleVariant {
227 Variant2 { a: u32, b: f32 },
232 // Remove a struct-style variant ----------------------------------------------
234 enum EnumRemoveStructStyleVariant {
236 Variant2 { a: u32, b: f32 },
240 #[rustc_dirty(label="Hir", cfg="cfail2")]
241 #[rustc_clean(label="Hir", cfg="cfail3")]
242 #[rustc_metadata_dirty(cfg="cfail2")]
243 #[rustc_metadata_clean(cfg="cfail3")]
244 enum EnumRemoveStructStyleVariant {
250 // Change the type of a field in a tuple-style variant ------------------------
252 enum EnumChangeFieldTypeTupleStyleVariant {
257 #[rustc_dirty(label="Hir", cfg="cfail2")]
258 #[rustc_clean(label="Hir", cfg="cfail3")]
259 #[rustc_metadata_dirty(cfg="cfail2")]
260 #[rustc_metadata_clean(cfg="cfail3")]
261 enum EnumChangeFieldTypeTupleStyleVariant {
267 // Change the type of a field in a struct-style variant -----------------------
269 enum EnumChangeFieldTypeStructStyleVariant {
271 Variant2 { a: u32, b: u32 },
275 #[rustc_dirty(label="Hir", cfg="cfail2")]
276 #[rustc_clean(label="Hir", cfg="cfail3")]
277 #[rustc_metadata_dirty(cfg="cfail2")]
278 #[rustc_metadata_clean(cfg="cfail3")]
279 enum EnumChangeFieldTypeStructStyleVariant {
281 Variant2 { a: u32, b: u64 },
286 // Change the name of a field in a struct-style variant -----------------------
288 enum EnumChangeFieldNameStructStyleVariant {
289 Variant1 { a: u32, b: u32 },
293 #[rustc_dirty(label="Hir", cfg="cfail2")]
294 #[rustc_clean(label="Hir", cfg="cfail3")]
295 #[rustc_metadata_dirty(cfg="cfail2")]
296 #[rustc_metadata_clean(cfg="cfail3")]
297 enum EnumChangeFieldNameStructStyleVariant {
298 Variant1 { a: u32, c: u32 },
303 // Change order of fields in a tuple-style variant ----------------------------
305 enum EnumChangeOrderTupleStyleVariant {
310 #[rustc_dirty(label="Hir", cfg="cfail2")]
311 #[rustc_clean(label="Hir", cfg="cfail3")]
312 #[rustc_metadata_dirty(cfg="cfail2")]
313 #[rustc_metadata_clean(cfg="cfail3")]
314 enum EnumChangeOrderTupleStyleVariant {
320 // Change order of fields in a struct-style variant ---------------------------
322 enum EnumChangeFieldOrderStructStyleVariant {
323 Variant1 { a: u32, b: f32 },
327 #[rustc_dirty(label="Hir", cfg="cfail2")]
328 #[rustc_clean(label="Hir", cfg="cfail3")]
329 #[rustc_metadata_dirty(cfg="cfail2")]
330 #[rustc_metadata_clean(cfg="cfail3")]
331 enum EnumChangeFieldOrderStructStyleVariant {
332 Variant1 { b: f32, a: u32 },
337 // Add a field to a tuple-style variant ---------------------------------------
339 enum EnumAddFieldTupleStyleVariant {
344 #[rustc_dirty(label="Hir", cfg="cfail2")]
345 #[rustc_clean(label="Hir", cfg="cfail3")]
346 #[rustc_metadata_dirty(cfg="cfail2")]
347 #[rustc_metadata_clean(cfg="cfail3")]
348 enum EnumAddFieldTupleStyleVariant {
349 Variant1(u32, u32, u32),
354 // Add a field to a struct-style variant --------------------------------------
356 enum EnumAddFieldStructStyleVariant {
357 Variant1 { a: u32, b: u32 },
361 #[rustc_dirty(label="Hir", cfg="cfail2")]
362 #[rustc_clean(label="Hir", cfg="cfail3")]
363 #[rustc_metadata_dirty(cfg="cfail2")]
364 #[rustc_metadata_clean(cfg="cfail3")]
365 enum EnumAddFieldStructStyleVariant {
366 Variant1 { a: u32, b: u32, c: u32 },
371 // Add #[must_use] to the enum ------------------------------------------------
373 enum EnumAddMustUse {
379 #[rustc_dirty(label="Hir", cfg="cfail2")]
380 #[rustc_clean(label="Hir", cfg="cfail3")]
381 #[rustc_metadata_dirty(cfg="cfail2")]
382 #[rustc_metadata_clean(cfg="cfail3")]
384 enum EnumAddMustUse {
391 // Add #[repr(C)] to the enum -------------------------------------------------
399 #[rustc_dirty(label="Hir", cfg="cfail2")]
400 #[rustc_clean(label="Hir", cfg="cfail3")]
401 #[rustc_metadata_dirty(cfg="cfail2")]
402 #[rustc_metadata_clean(cfg="cfail3")]
411 // Change the name of a type parameter ----------------------------------------
413 enum EnumChangeNameOfTypeParameter<S> {
418 #[rustc_dirty(label="Hir", cfg="cfail2")]
419 #[rustc_clean(label="Hir", cfg="cfail3")]
420 #[rustc_metadata_dirty(cfg="cfail2")]
421 #[rustc_metadata_clean(cfg="cfail3")]
423 enum EnumChangeNameOfTypeParameter<T> {
429 // Add a type parameter ------------------------------------------------------
431 enum EnumAddTypeParameter<S> {
437 #[rustc_dirty(label="Hir", cfg="cfail2")]
438 #[rustc_clean(label="Hir", cfg="cfail3")]
439 #[rustc_metadata_dirty(cfg="cfail2")]
440 #[rustc_metadata_clean(cfg="cfail3")]
442 enum EnumAddTypeParameter<S, T> {
449 // Change the name of a lifetime parameter ------------------------------------
451 enum EnumChangeNameOfLifetimeParameter<'a> {
456 #[rustc_dirty(label="Hir", cfg="cfail2")]
457 #[rustc_clean(label="Hir", cfg="cfail3")]
458 #[rustc_metadata_dirty(cfg="cfail2")]
459 #[rustc_metadata_clean(cfg="cfail3")]
461 enum EnumChangeNameOfLifetimeParameter<'b> {
467 // Add a lifetime parameter ---------------------------------------------------
469 enum EnumAddLifetimeParameter<'a> {
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")]
480 enum EnumAddLifetimeParameter<'a, 'b> {
487 // Add a lifetime bound to a lifetime parameter -------------------------------
489 enum EnumAddLifetimeParameterBound<'a, 'b> {
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")]
500 enum EnumAddLifetimeParameterBound<'a, 'b: 'a> {
505 // Add a lifetime bound to a type parameter -----------------------------------
507 enum EnumAddLifetimeBoundToParameter<'a, T> {
513 #[rustc_dirty(label="Hir", cfg="cfail2")]
514 #[rustc_clean(label="Hir", cfg="cfail3")]
515 #[rustc_metadata_dirty(cfg="cfail2")]
516 #[rustc_metadata_clean(cfg="cfail3")]
518 enum EnumAddLifetimeBoundToParameter<'a, T: 'a> {
525 // Add a trait bound to a type parameter --------------------------------------
527 enum EnumAddTraitBound<S> {
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")]
537 enum EnumAddTraitBound<T: Sync> {
543 // Add a lifetime bound to a lifetime parameter in where clause ---------------
545 enum EnumAddLifetimeParameterBoundWhere<'a, 'b> {
551 #[rustc_dirty(label="Hir", cfg="cfail2")]
552 #[rustc_clean(label="Hir", cfg="cfail3")]
553 #[rustc_metadata_dirty(cfg="cfail2")]
554 #[rustc_metadata_clean(cfg="cfail3")]
556 enum EnumAddLifetimeParameterBoundWhere<'a, 'b> where 'b: 'a {
563 // Add a lifetime bound to a type parameter in where clause -------------------
565 enum EnumAddLifetimeBoundToParameterWhere<'a, T> {
571 #[rustc_dirty(label="Hir", cfg="cfail2")]
572 #[rustc_clean(label="Hir", cfg="cfail3")]
573 #[rustc_metadata_dirty(cfg="cfail2")]
574 #[rustc_metadata_clean(cfg="cfail3")]
576 enum EnumAddLifetimeBoundToParameterWhere<'a, T> where T: 'a {
583 // Add a trait bound to a type parameter in where clause ----------------------
585 enum EnumAddTraitBoundWhere<S> {
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")]
595 enum EnumAddTraitBoundWhere<T> where T: Sync {
601 // In an enum with two variants, swap usage of type parameters ----------------
603 enum EnumSwapUsageTypeParameters<A, B> {
609 #[rustc_dirty(label="Hir", cfg="cfail2")]
610 #[rustc_clean(label="Hir", cfg="cfail3")]
611 #[rustc_metadata_dirty(cfg="cfail2")]
612 #[rustc_metadata_clean(cfg="cfail3")]
613 enum EnumSwapUsageTypeParameters<A, B> {
620 // In an enum with two variants, swap usage of lifetime parameters ------------
622 enum EnumSwapUsageLifetimeParameters<'a, 'b> {
623 Variant1 { a: &'a u32 },
624 Variant2 { b: &'b u32 },
628 #[rustc_dirty(label="Hir", cfg="cfail2")]
629 #[rustc_clean(label="Hir", cfg="cfail3")]
630 #[rustc_metadata_dirty(cfg="cfail2")]
631 #[rustc_metadata_clean(cfg="cfail3")]
632 enum EnumSwapUsageLifetimeParameters<'a, 'b> {
633 Variant1 { a: &'b u32 },
634 Variant2 { b: &'a u32 },
639 struct ReferencedType1;
640 struct ReferencedType2;
644 // Change field type in tuple-style variant indirectly by modifying a use statement
645 mod change_field_type_indirectly_tuple_style {
647 use super::ReferencedType1 as FieldType;
649 use super::ReferencedType2 as FieldType;
651 #[rustc_dirty(label="Hir", cfg="cfail2")]
652 #[rustc_clean(label="Hir", cfg="cfail3")]
653 #[rustc_metadata_dirty(cfg="cfail2")]
654 #[rustc_metadata_clean(cfg="cfail3")]
662 // Change field type in record-style variant indirectly by modifying a use statement
663 mod change_field_type_indirectly_struct_style {
665 use super::ReferencedType1 as FieldType;
667 use super::ReferencedType2 as FieldType;
669 #[rustc_dirty(label="Hir", cfg="cfail2")]
670 #[rustc_clean(label="Hir", cfg="cfail3")]
671 #[rustc_metadata_dirty(cfg="cfail2")]
672 #[rustc_metadata_clean(cfg="cfail3")]
674 Variant1 { a: FieldType }
680 trait ReferencedTrait1 {}
681 trait ReferencedTrait2 {}
685 // Change trait bound of type parameter indirectly by modifying a use statement
686 mod change_trait_bound_indirectly {
688 use super::ReferencedTrait1 as Trait;
690 use super::ReferencedTrait2 as Trait;
692 #[rustc_dirty(label="Hir", cfg="cfail2")]
693 #[rustc_clean(label="Hir", cfg="cfail3")]
694 #[rustc_metadata_dirty(cfg="cfail2")]
695 #[rustc_metadata_clean(cfg="cfail3")]
696 enum Enum<T: Trait> {
703 // Change trait bound of type parameter in where clause indirectly by modifying a use statement
704 mod change_trait_bound_indirectly_where {
706 use super::ReferencedTrait1 as Trait;
708 use super::ReferencedTrait2 as Trait;
710 #[rustc_dirty(label="Hir", cfg="cfail2")]
711 #[rustc_clean(label="Hir", cfg="cfail3")]
712 #[rustc_metadata_dirty(cfg="cfail2")]
713 #[rustc_metadata_clean(cfg="cfail3")]
714 enum Enum<T> where T: Trait {