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_clean(cfg="cfail2")]
116 #[rustc_metadata_clean(cfg="cfail3")]
117 enum EnumChangeValueCStyleVariant0
{
120 #[rustc_metadata_dirty(cfg="cfail2")]
121 #[rustc_metadata_clean(cfg="cfail3")]
126 enum EnumChangeValueCStyleVariant1
{
132 #[rustc_dirty(label="Hir", cfg="cfail2")]
133 #[rustc_clean(label="Hir", cfg="cfail3")]
134 #[rustc_clean(label="HirBody", cfg="cfail2")]
135 #[rustc_clean(label="HirBody", cfg="cfail3")]
136 #[rustc_metadata_dirty(cfg="cfail2")]
137 #[rustc_metadata_clean(cfg="cfail3")]
138 enum EnumChangeValueCStyleVariant1
{
145 // Add a c-style variant ------------------------------------------------------
147 enum EnumAddCStyleVariant
{
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")]
156 enum EnumAddCStyleVariant
{
163 // Remove a c-style variant ---------------------------------------------------
165 enum EnumRemoveCStyleVariant
{
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")]
175 enum EnumRemoveCStyleVariant
{
181 // Add a tuple-style variant --------------------------------------------------
183 enum EnumAddTupleStyleVariant
{
188 #[rustc_dirty(label="Hir", cfg="cfail2")]
189 #[rustc_clean(label="Hir", cfg="cfail3")]
190 #[rustc_metadata_dirty(cfg="cfail2")]
191 #[rustc_metadata_clean(cfg="cfail3")]
192 enum EnumAddTupleStyleVariant
{
199 // Remove a tuple-style variant -----------------------------------------------
201 enum EnumRemoveTupleStyleVariant
{
207 #[rustc_dirty(label="Hir", cfg="cfail2")]
208 #[rustc_clean(label="Hir", cfg="cfail3")]
209 #[rustc_metadata_dirty(cfg="cfail2")]
210 #[rustc_metadata_clean(cfg="cfail3")]
211 enum EnumRemoveTupleStyleVariant
{
217 // Add a struct-style variant -------------------------------------------------
219 enum EnumAddStructStyleVariant
{
224 #[rustc_dirty(label="Hir", cfg="cfail2")]
225 #[rustc_clean(label="Hir", cfg="cfail3")]
226 #[rustc_metadata_dirty(cfg="cfail2")]
227 #[rustc_metadata_clean(cfg="cfail3")]
228 enum EnumAddStructStyleVariant
{
230 Variant2 { a: u32, b: f32 }
,
235 // Remove a struct-style variant ----------------------------------------------
237 enum EnumRemoveStructStyleVariant
{
239 Variant2 { a: u32, b: f32 }
,
243 #[rustc_dirty(label="Hir", cfg="cfail2")]
244 #[rustc_clean(label="Hir", cfg="cfail3")]
245 #[rustc_metadata_dirty(cfg="cfail2")]
246 #[rustc_metadata_clean(cfg="cfail3")]
247 enum EnumRemoveStructStyleVariant
{
253 // Change the type of a field in a tuple-style variant ------------------------
255 enum EnumChangeFieldTypeTupleStyleVariant
{
260 #[rustc_dirty(label="Hir", cfg="cfail2")]
261 #[rustc_clean(label="Hir", cfg="cfail3")]
262 #[rustc_metadata_dirty(cfg="cfail2")]
263 #[rustc_metadata_clean(cfg="cfail3")]
264 enum EnumChangeFieldTypeTupleStyleVariant
{
270 // Change the type of a field in a struct-style variant -----------------------
272 enum EnumChangeFieldTypeStructStyleVariant
{
274 Variant2 { a: u32, b: u32 }
,
278 #[rustc_dirty(label="Hir", cfg="cfail2")]
279 #[rustc_clean(label="Hir", cfg="cfail3")]
280 #[rustc_metadata_dirty(cfg="cfail2")]
281 #[rustc_metadata_clean(cfg="cfail3")]
282 enum EnumChangeFieldTypeStructStyleVariant
{
284 Variant2 { a: u32, b: u64 }
,
289 // Change the name of a field in a struct-style variant -----------------------
291 enum EnumChangeFieldNameStructStyleVariant
{
292 Variant1 { a: u32, b: u32 }
,
296 #[rustc_dirty(label="Hir", cfg="cfail2")]
297 #[rustc_clean(label="Hir", cfg="cfail3")]
298 #[rustc_metadata_dirty(cfg="cfail2")]
299 #[rustc_metadata_clean(cfg="cfail3")]
300 enum EnumChangeFieldNameStructStyleVariant
{
301 Variant1 { a: u32, c: u32 }
,
306 // Change order of fields in a tuple-style variant ----------------------------
308 enum EnumChangeOrderTupleStyleVariant
{
313 #[rustc_dirty(label="Hir", cfg="cfail2")]
314 #[rustc_clean(label="Hir", cfg="cfail3")]
315 #[rustc_metadata_dirty(cfg="cfail2")]
316 #[rustc_metadata_clean(cfg="cfail3")]
317 enum EnumChangeOrderTupleStyleVariant
{
323 // Change order of fields in a struct-style variant ---------------------------
325 enum EnumChangeFieldOrderStructStyleVariant
{
326 Variant1 { a: u32, b: f32 }
,
330 #[rustc_dirty(label="Hir", cfg="cfail2")]
331 #[rustc_clean(label="Hir", cfg="cfail3")]
332 #[rustc_metadata_dirty(cfg="cfail2")]
333 #[rustc_metadata_clean(cfg="cfail3")]
334 enum EnumChangeFieldOrderStructStyleVariant
{
335 Variant1 { b: f32, a: u32 }
,
340 // Add a field to a tuple-style variant ---------------------------------------
342 enum EnumAddFieldTupleStyleVariant
{
347 #[rustc_dirty(label="Hir", cfg="cfail2")]
348 #[rustc_clean(label="Hir", cfg="cfail3")]
349 #[rustc_metadata_dirty(cfg="cfail2")]
350 #[rustc_metadata_clean(cfg="cfail3")]
351 enum EnumAddFieldTupleStyleVariant
{
352 Variant1(u32, u32, u32),
357 // Add a field to a struct-style variant --------------------------------------
359 enum EnumAddFieldStructStyleVariant
{
360 Variant1 { a: u32, b: u32 }
,
364 #[rustc_dirty(label="Hir", cfg="cfail2")]
365 #[rustc_clean(label="Hir", cfg="cfail3")]
366 #[rustc_metadata_dirty(cfg="cfail2")]
367 #[rustc_metadata_clean(cfg="cfail3")]
368 enum EnumAddFieldStructStyleVariant
{
369 Variant1 { a: u32, b: u32, c: u32 }
,
374 // Add #[must_use] to the enum ------------------------------------------------
376 enum EnumAddMustUse
{
382 #[rustc_dirty(label="Hir", cfg="cfail2")]
383 #[rustc_clean(label="Hir", cfg="cfail3")]
384 #[rustc_metadata_dirty(cfg="cfail2")]
385 #[rustc_metadata_clean(cfg="cfail3")]
387 enum EnumAddMustUse
{
394 // Add #[repr(C)] to the enum -------------------------------------------------
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")]
414 // Change the name of a type parameter ----------------------------------------
416 enum EnumChangeNameOfTypeParameter
<S
> {
421 #[rustc_dirty(label="Hir", cfg="cfail2")]
422 #[rustc_clean(label="Hir", cfg="cfail3")]
423 #[rustc_metadata_dirty(cfg="cfail2")]
424 #[rustc_metadata_clean(cfg="cfail3")]
426 enum EnumChangeNameOfTypeParameter
<T
> {
432 // Add a type parameter ------------------------------------------------------
434 enum EnumAddTypeParameter
<S
> {
440 #[rustc_dirty(label="Hir", cfg="cfail2")]
441 #[rustc_clean(label="Hir", cfg="cfail3")]
442 #[rustc_metadata_dirty(cfg="cfail2")]
443 #[rustc_metadata_clean(cfg="cfail3")]
445 enum EnumAddTypeParameter
<S
, T
> {
452 // Change the name of a lifetime parameter ------------------------------------
454 enum EnumChangeNameOfLifetimeParameter
<'a
> {
459 #[rustc_dirty(label="Hir", cfg="cfail2")]
460 #[rustc_clean(label="Hir", cfg="cfail3")]
461 #[rustc_metadata_dirty(cfg="cfail2")]
462 #[rustc_metadata_clean(cfg="cfail3")]
464 enum EnumChangeNameOfLifetimeParameter
<'b
> {
470 // Add a lifetime parameter ---------------------------------------------------
472 enum EnumAddLifetimeParameter
<'a
> {
478 #[rustc_dirty(label="Hir", cfg="cfail2")]
479 #[rustc_clean(label="Hir", cfg="cfail3")]
480 #[rustc_metadata_dirty(cfg="cfail2")]
481 #[rustc_metadata_clean(cfg="cfail3")]
483 enum EnumAddLifetimeParameter
<'a
, 'b
> {
490 // Add a lifetime bound to a lifetime parameter -------------------------------
492 enum EnumAddLifetimeParameterBound
<'a
, 'b
> {
498 #[rustc_dirty(label="Hir", cfg="cfail2")]
499 #[rustc_clean(label="Hir", cfg="cfail3")]
500 #[rustc_metadata_dirty(cfg="cfail2")]
501 #[rustc_metadata_clean(cfg="cfail3")]
503 enum EnumAddLifetimeParameterBound
<'a
, 'b
: 'a
> {
508 // Add a lifetime bound to a type parameter -----------------------------------
510 enum EnumAddLifetimeBoundToParameter
<'a
, T
> {
516 #[rustc_dirty(label="Hir", cfg="cfail2")]
517 #[rustc_clean(label="Hir", cfg="cfail3")]
518 #[rustc_metadata_dirty(cfg="cfail2")]
519 #[rustc_metadata_clean(cfg="cfail3")]
521 enum EnumAddLifetimeBoundToParameter
<'a
, T
: 'a
> {
528 // Add a trait bound to a type parameter --------------------------------------
530 enum EnumAddTraitBound
<S
> {
535 #[rustc_dirty(label="Hir", cfg="cfail2")]
536 #[rustc_clean(label="Hir", cfg="cfail3")]
537 #[rustc_metadata_dirty(cfg="cfail2")]
538 #[rustc_metadata_clean(cfg="cfail3")]
540 enum EnumAddTraitBound
<T
: Sync
> {
546 // Add a lifetime bound to a lifetime parameter in where clause ---------------
548 enum EnumAddLifetimeParameterBoundWhere
<'a
, 'b
> {
554 #[rustc_dirty(label="Hir", cfg="cfail2")]
555 #[rustc_clean(label="Hir", cfg="cfail3")]
556 #[rustc_metadata_dirty(cfg="cfail2")]
557 #[rustc_metadata_clean(cfg="cfail3")]
559 enum EnumAddLifetimeParameterBoundWhere
<'a
, 'b
> where 'b
: 'a
{
566 // Add a lifetime bound to a type parameter in where clause -------------------
568 enum EnumAddLifetimeBoundToParameterWhere
<'a
, T
> {
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")]
579 enum EnumAddLifetimeBoundToParameterWhere
<'a
, T
> where T
: 'a
{
586 // Add a trait bound to a type parameter in where clause ----------------------
588 enum EnumAddTraitBoundWhere
<S
> {
593 #[rustc_dirty(label="Hir", cfg="cfail2")]
594 #[rustc_clean(label="Hir", cfg="cfail3")]
595 #[rustc_metadata_dirty(cfg="cfail2")]
596 #[rustc_metadata_clean(cfg="cfail3")]
598 enum EnumAddTraitBoundWhere
<T
> where T
: Sync
{
604 // In an enum with two variants, swap usage of type parameters ----------------
606 enum EnumSwapUsageTypeParameters
<A
, B
> {
612 #[rustc_dirty(label="Hir", cfg="cfail2")]
613 #[rustc_clean(label="Hir", cfg="cfail3")]
614 #[rustc_metadata_dirty(cfg="cfail2")]
615 #[rustc_metadata_clean(cfg="cfail3")]
616 enum EnumSwapUsageTypeParameters
<A
, B
> {
623 // In an enum with two variants, swap usage of lifetime parameters ------------
625 enum EnumSwapUsageLifetimeParameters
<'a
, 'b
> {
626 Variant1 { a: &'a u32 }
,
627 Variant2 { b: &'b u32 }
,
631 #[rustc_dirty(label="Hir", cfg="cfail2")]
632 #[rustc_clean(label="Hir", cfg="cfail3")]
633 #[rustc_metadata_dirty(cfg="cfail2")]
634 #[rustc_metadata_clean(cfg="cfail3")]
635 enum EnumSwapUsageLifetimeParameters
<'a
, 'b
> {
636 Variant1 { a: &'b u32 }
,
637 Variant2 { b: &'a u32 }
,
642 struct ReferencedType1
;
643 struct ReferencedType2
;
647 // Change field type in tuple-style variant indirectly by modifying a use statement
648 mod change_field_type_indirectly_tuple_style
{
650 use super::ReferencedType1
as FieldType
;
652 use super::ReferencedType2
as FieldType
;
654 #[rustc_dirty(label="Hir", cfg="cfail2")]
655 #[rustc_clean(label="Hir", cfg="cfail3")]
656 #[rustc_metadata_dirty(cfg="cfail2")]
657 #[rustc_metadata_clean(cfg="cfail3")]
665 // Change field type in record-style variant indirectly by modifying a use statement
666 mod change_field_type_indirectly_struct_style
{
668 use super::ReferencedType1
as FieldType
;
670 use super::ReferencedType2
as FieldType
;
672 #[rustc_dirty(label="Hir", cfg="cfail2")]
673 #[rustc_clean(label="Hir", cfg="cfail3")]
674 #[rustc_metadata_dirty(cfg="cfail2")]
675 #[rustc_metadata_clean(cfg="cfail3")]
677 Variant1 { a: FieldType }
683 trait ReferencedTrait1 {}
684 trait ReferencedTrait2 {}
688 // Change trait bound of type parameter indirectly by modifying a use statement
689 mod change_trait_bound_indirectly
{
691 use super::ReferencedTrait1
as Trait
;
693 use super::ReferencedTrait2
as Trait
;
695 #[rustc_dirty(label="Hir", cfg="cfail2")]
696 #[rustc_clean(label="Hir", cfg="cfail3")]
697 #[rustc_metadata_dirty(cfg="cfail2")]
698 #[rustc_metadata_clean(cfg="cfail3")]
699 enum Enum
<T
: Trait
> {
706 // Change trait bound of type parameter in where clause indirectly by modifying a use statement
707 mod change_trait_bound_indirectly_where
{
709 use super::ReferencedTrait1
as Trait
;
711 use super::ReferencedTrait2
as Trait
;
713 #[rustc_dirty(label="Hir", cfg="cfail2")]
714 #[rustc_clean(label="Hir", cfg="cfail3")]
715 #[rustc_metadata_dirty(cfg="cfail2")]
716 #[rustc_metadata_clean(cfg="cfail3")]
717 enum Enum
<T
> where T
: Trait
{