mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			364 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			364 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // This test case tests the incremental compilation hash (ICH) implementation
 | |
| // for struct constructor expressions.
 | |
| 
 | |
| // The general pattern followed here is: Change one thing between rev1 and rev2
 | |
| // and make sure that the hash has changed, then change nothing between rev2 and
 | |
| // rev3 and make sure that the hash has not changed.
 | |
| 
 | |
| //@ build-pass (FIXME(62277): could be check-pass?)
 | |
| //@ revisions: cfail1 cfail2 cfail3 cfail4 cfail5 cfail6
 | |
| //@ compile-flags: -Z query-dep-graph -O
 | |
| //@ [cfail1]compile-flags: -Zincremental-ignore-spans
 | |
| //@ [cfail2]compile-flags: -Zincremental-ignore-spans
 | |
| //@ [cfail3]compile-flags: -Zincremental-ignore-spans
 | |
| 
 | |
| #![allow(warnings)]
 | |
| #![feature(rustc_attrs)]
 | |
| #![crate_type="rlib"]
 | |
| 
 | |
| 
 | |
| pub enum Enum {
 | |
|     Struct {
 | |
|         x: i32,
 | |
|         y: i64,
 | |
|         z: i16,
 | |
|     },
 | |
|     Tuple(i32, i64, i16)
 | |
| }
 | |
| 
 | |
| // Change field value (struct-like) -----------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_field_value_struct_like() -> Enum {
 | |
|     Enum::Struct {
 | |
|         x: 0,
 | |
|         y: 1,
 | |
|         z: 2,
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_field_value_struct_like() -> Enum {
 | |
|     Enum::Struct {
 | |
|         x: 0,
 | |
|         y: 2,
 | |
|         z: 2,
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change field order (struct-like) -----------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_field_order_struct_like() -> Enum {
 | |
|     Enum::Struct {
 | |
|         x: 3,
 | |
|         y: 4,
 | |
|         z: 5,
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,typeck")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,typeck,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| // FIXME(michaelwoerister):Interesting. I would have thought that that changes the MIR. And it
 | |
| // would if it were not all constants
 | |
| pub fn change_field_order_struct_like() -> Enum {
 | |
|     Enum::Struct {
 | |
|         y: 4,
 | |
|         x: 3,
 | |
|         z: 5,
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| pub enum Enum2 {
 | |
|     Struct {
 | |
|         x: i8,
 | |
|         y: i8,
 | |
|         z: i8,
 | |
|     },
 | |
|     Struct2 {
 | |
|         x: i8,
 | |
|         y: i8,
 | |
|         z: i8,
 | |
|     },
 | |
|     Tuple(u16, u16, u16),
 | |
|     Tuple2(u64, u64, u64),
 | |
| }
 | |
| 
 | |
| // Change constructor path (struct-like) ------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_constructor_path_struct_like() {
 | |
|     let _ = Enum ::Struct {
 | |
|         x: 0,
 | |
|         y: 1,
 | |
|         z: 2,
 | |
|     };
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,typeck")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,typeck")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_constructor_path_struct_like() {
 | |
|     let _ = Enum2::Struct {
 | |
|         x: 0,
 | |
|         y: 1,
 | |
|         z: 2,
 | |
|     };
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change variant (regular struct) ------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_constructor_variant_struct_like() {
 | |
|     let _ = Enum2::Struct  {
 | |
|         x: 0,
 | |
|         y: 1,
 | |
|         z: 2,
 | |
|     };
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_constructor_variant_struct_like() {
 | |
|     let _ = Enum2::Struct2 {
 | |
|         x: 0,
 | |
|         y: 1,
 | |
|         z: 2,
 | |
|     };
 | |
| }
 | |
| 
 | |
| 
 | |
| // Change constructor path indirectly (struct-like) -------------------------
 | |
| pub mod change_constructor_path_indirectly_struct_like {
 | |
|     #[cfg(any(cfail1,cfail4))]
 | |
|     use super::Enum as TheEnum;
 | |
|     #[cfg(not(any(cfail1,cfail4)))]
 | |
|     use super::Enum2 as TheEnum;
 | |
| 
 | |
|     #[rustc_clean(cfg="cfail2", except="fn_sig,opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail3")]
 | |
|     #[rustc_clean(cfg="cfail5", except="fn_sig,opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail6")]
 | |
|     pub fn function() -> TheEnum {
 | |
|         TheEnum::Struct {
 | |
|             x: 0,
 | |
|             y: 1,
 | |
|             z: 2,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| // Change constructor variant indirectly (struct-like) ---------------------------
 | |
| pub mod change_constructor_variant_indirectly_struct_like {
 | |
|     use super::Enum2;
 | |
|     #[cfg(any(cfail1,cfail4))]
 | |
|     use super::Enum2::Struct as Variant;
 | |
|     #[cfg(not(any(cfail1,cfail4)))]
 | |
|     use super::Enum2::Struct2 as Variant;
 | |
| 
 | |
|     #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")]
 | |
|     #[rustc_clean(cfg="cfail3")]
 | |
|     #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir")]
 | |
|     #[rustc_clean(cfg="cfail6")]
 | |
|     pub fn function() -> Enum2 {
 | |
|         Variant {
 | |
|             x: 0,
 | |
|             y: 1,
 | |
|             z: 2,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| // Change field value (tuple-like) -------------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_field_value_tuple_like() -> Enum {
 | |
|     Enum::Tuple(0, 1, 2)
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_field_value_tuple_like() -> Enum {
 | |
|     Enum::Tuple(0, 1, 3)
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change constructor path (tuple-like) --------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_constructor_path_tuple_like() {
 | |
|     let _ = Enum ::Tuple(0, 1, 2);
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(
 | |
|     cfg="cfail2",
 | |
|     except="opt_hir_owner_nodes,typeck"
 | |
| )]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(
 | |
|     cfg="cfail5",
 | |
|     except="opt_hir_owner_nodes,typeck"
 | |
| )]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_constructor_path_tuple_like() {
 | |
|     let _ = Enum2::Tuple(0, 1, 2);
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change constructor variant (tuple-like) --------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_constructor_variant_tuple_like() {
 | |
|     let _ = Enum2::Tuple (0, 1, 2);
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(
 | |
|     cfg="cfail2",
 | |
|     except="opt_hir_owner_nodes,typeck"
 | |
| )]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(
 | |
|     cfg="cfail5",
 | |
|     except="opt_hir_owner_nodes,typeck"
 | |
| )]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_constructor_variant_tuple_like() {
 | |
|     let _ = Enum2::Tuple2(0, 1, 2);
 | |
| }
 | |
| 
 | |
| 
 | |
| // Change constructor path indirectly (tuple-like) ---------------------------
 | |
| pub mod change_constructor_path_indirectly_tuple_like {
 | |
|     #[cfg(any(cfail1,cfail4))]
 | |
|     use super::Enum as TheEnum;
 | |
|     #[cfg(not(any(cfail1,cfail4)))]
 | |
|     use super::Enum2 as TheEnum;
 | |
| 
 | |
|     #[rustc_clean(cfg="cfail2", except="fn_sig,opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail3")]
 | |
|     #[rustc_clean(cfg="cfail5", except="fn_sig,opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail6")]
 | |
|     pub fn function() -> TheEnum {
 | |
|         TheEnum::Tuple(0, 1, 2)
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change constructor variant indirectly (tuple-like) ---------------------------
 | |
| pub mod change_constructor_variant_indirectly_tuple_like {
 | |
|     use super::Enum2;
 | |
|     #[cfg(any(cfail1,cfail4))]
 | |
|     use super::Enum2::Tuple as Variant;
 | |
|     #[cfg(not(any(cfail1,cfail4)))]
 | |
|     use super::Enum2::Tuple2 as Variant;
 | |
| 
 | |
|     #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail3")]
 | |
|     #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail6")]
 | |
|     pub fn function() -> Enum2 {
 | |
|         Variant(0, 1, 2)
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| pub enum Clike {
 | |
|     A,
 | |
|     B,
 | |
|     C
 | |
| }
 | |
| 
 | |
| pub enum Clike2 {
 | |
|     B,
 | |
|     C,
 | |
|     D
 | |
| }
 | |
| 
 | |
| // Change constructor path (C-like) --------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_constructor_path_c_like() {
 | |
|     let _x = Clike ::B;
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_constructor_path_c_like() {
 | |
|     let _x = Clike2::B;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change constructor variant (C-like) --------------------------------------
 | |
| #[cfg(any(cfail1,cfail4))]
 | |
| pub fn change_constructor_variant_c_like() {
 | |
|     let _x = Clike::A;
 | |
| }
 | |
| 
 | |
| #[cfg(not(any(cfail1,cfail4)))]
 | |
| #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail3")]
 | |
| #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir")]
 | |
| #[rustc_clean(cfg="cfail6")]
 | |
| pub fn change_constructor_variant_c_like() {
 | |
|     let _x = Clike::C;
 | |
| }
 | |
| 
 | |
| 
 | |
| // Change constructor path indirectly (C-like) ---------------------------
 | |
| pub mod change_constructor_path_indirectly_c_like {
 | |
|     #[cfg(any(cfail1,cfail4))]
 | |
|     use super::Clike as TheEnum;
 | |
|     #[cfg(not(any(cfail1,cfail4)))]
 | |
|     use super::Clike2 as TheEnum;
 | |
| 
 | |
|     #[rustc_clean(cfg="cfail2", except="fn_sig,opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail3")]
 | |
|     #[rustc_clean(cfg="cfail5", except="fn_sig,opt_hir_owner_nodes,optimized_mir,typeck")]
 | |
|     #[rustc_clean(cfg="cfail6")]
 | |
|     pub fn function() -> TheEnum {
 | |
|         TheEnum::B
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| // Change constructor variant indirectly (C-like) ---------------------------
 | |
| pub mod change_constructor_variant_indirectly_c_like {
 | |
|     use super::Clike;
 | |
|     #[cfg(any(cfail1,cfail4))]
 | |
|     use super::Clike::A as Variant;
 | |
|     #[cfg(not(any(cfail1,cfail4)))]
 | |
|     use super::Clike::B as Variant;
 | |
| 
 | |
|     #[rustc_clean(cfg="cfail2", except="opt_hir_owner_nodes,optimized_mir")]
 | |
|     #[rustc_clean(cfg="cfail3")]
 | |
|     #[rustc_clean(cfg="cfail5", except="opt_hir_owner_nodes,optimized_mir")]
 | |
|     #[rustc_clean(cfg="cfail6")]
 | |
|     pub fn function() -> Clike {
 | |
|         Variant
 | |
|     }
 | |
| }
 | 
