// This test case tests the incremental compilation hash (ICH) implementation // for let 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. // compile-pass // revisions: cfail1 cfail2 cfail3 // compile-flags: -Z query-dep-graph -Zincremental-ignore-spans #![allow(warnings)] #![feature(rustc_attrs)] #![feature(specialization)] #![crate_type="rlib"] struct Foo; // Change Method Name ----------------------------------------------------------- #[cfg(cfail1)] pub trait ChangeMethodNameTrait { fn method_name(); } #[cfg(cfail1)] impl ChangeMethodNameTrait for Foo { fn method_name() { } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] pub trait ChangeMethodNameTrait { #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name2(); } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeMethodNameTrait for Foo { #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name2() { } } // Change Method Body ----------------------------------------------------------- // // This should affect the method itself, but not the impl. pub trait ChangeMethodBodyTrait { fn method_name(); } #[cfg(cfail1)] impl ChangeMethodBodyTrait for Foo { fn method_name() { } } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeMethodBodyTrait for Foo { #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] #[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(label="HirBody", cfg="cfail3")] fn method_name() { () } } // Change Method Body (inlined fn) --------------------------------------------- // // This should affect the method itself, but not the impl. pub trait ChangeMethodBodyTraitInlined { fn method_name(); } #[cfg(cfail1)] impl ChangeMethodBodyTraitInlined for Foo { #[inline] fn method_name() { } } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeMethodBodyTraitInlined for Foo { #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] #[rustc_dirty(label="HirBody", cfg="cfail2")] #[rustc_clean(label="HirBody", cfg="cfail3")] #[inline] fn method_name() { panic!() } } // Change Method Selfness ------------------------------------------------------ #[cfg(cfail1)] pub trait ChangeMethodSelfnessTrait { fn method_name(); } #[cfg(cfail1)] impl ChangeMethodSelfnessTrait for Foo { fn method_name() { } } #[cfg(not(cfail1))] pub trait ChangeMethodSelfnessTrait { fn method_name(&self); } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeMethodSelfnessTrait for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name(&self) { () } } // Change Method Selfness ----------------------------------------------------------- #[cfg(cfail1)] pub trait RemoveMethodSelfnessTrait { fn method_name(&self); } #[cfg(cfail1)] impl RemoveMethodSelfnessTrait for Foo { fn method_name(&self) { } } #[cfg(not(cfail1))] pub trait RemoveMethodSelfnessTrait { fn method_name(); } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl RemoveMethodSelfnessTrait for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name() {} } // Change Method Selfmutness ----------------------------------------------------------- #[cfg(cfail1)] pub trait ChangeMethodSelfmutnessTrait { fn method_name(&self); } #[cfg(cfail1)] impl ChangeMethodSelfmutnessTrait for Foo { fn method_name(&self) { } } #[cfg(not(cfail1))] pub trait ChangeMethodSelfmutnessTrait { fn method_name(&mut self); } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeMethodSelfmutnessTrait for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name(&mut self) {} } // Change item kind ----------------------------------------------------------- #[cfg(cfail1)] pub trait ChangeItemKindTrait { fn name(); } #[cfg(cfail1)] impl ChangeItemKindTrait for Foo { fn name() { } } #[cfg(not(cfail1))] pub trait ChangeItemKindTrait { type name; } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeItemKindTrait for Foo { type name = (); } // Remove item ----------------------------------------------------------- #[cfg(cfail1)] pub trait RemoveItemTrait { type TypeName; fn method_name(); } #[cfg(cfail1)] impl RemoveItemTrait for Foo { type TypeName = (); fn method_name() { } } #[cfg(not(cfail1))] pub trait RemoveItemTrait { type TypeName; } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl RemoveItemTrait for Foo { type TypeName = (); } // Add item ----------------------------------------------------------- #[cfg(cfail1)] pub trait AddItemTrait { type TypeName; } #[cfg(cfail1)] impl AddItemTrait for Foo { type TypeName = (); } #[cfg(not(cfail1))] pub trait AddItemTrait { type TypeName; fn method_name(); } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddItemTrait for Foo { type TypeName = (); fn method_name() { } } // Change has-value ----------------------------------------------------------- #[cfg(cfail1)] pub trait ChangeHasValueTrait { fn method_name(); } #[cfg(cfail1)] impl ChangeHasValueTrait for Foo { fn method_name() { } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] pub trait ChangeHasValueTrait { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name() { } } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeHasValueTrait for Foo { fn method_name() { } } // Add default pub trait AddDefaultTrait { fn method_name(); } #[cfg(cfail1)] impl AddDefaultTrait for Foo { fn method_name() { } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddDefaultTrait for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] default fn method_name() { } } // Add arguments #[cfg(cfail1)] pub trait AddArgumentTrait { fn method_name(&self); } #[cfg(cfail1)] impl AddArgumentTrait for Foo { fn method_name(&self) { } } #[cfg(not(cfail1))] pub trait AddArgumentTrait { fn method_name(&self, x: u32); } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddArgumentTrait for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name(&self, _x: u32) { } } // Change argument type #[cfg(cfail1)] pub trait ChangeArgumentTypeTrait { fn method_name(&self, x: u32); } #[cfg(cfail1)] impl ChangeArgumentTypeTrait for Foo { fn method_name(&self, _x: u32) { } } #[cfg(not(cfail1))] pub trait ChangeArgumentTypeTrait { fn method_name(&self, x: char); } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeArgumentTypeTrait for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn method_name(&self, _x: char) { } } struct Bar(T); // Add Type Parameter To Impl -------------------------------------------------- trait AddTypeParameterToImpl { fn id(t: T) -> T; } #[cfg(cfail1)] impl AddTypeParameterToImpl for Bar { fn id(t: u32) -> u32 { t } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddTypeParameterToImpl for Bar { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn id(t: T) -> T { t } } // Change Self Type of Impl ---------------------------------------------------- trait ChangeSelfTypeOfImpl { fn id(self) -> Self; } #[cfg(cfail1)] impl ChangeSelfTypeOfImpl for u32 { fn id(self) -> Self { self } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl ChangeSelfTypeOfImpl for u64 { #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn id(self) -> Self { self } } // Add Lifetime Bound to Impl -------------------------------------------------- trait AddLifetimeBoundToImplParameter { fn id(self) -> Self; } #[cfg(cfail1)] impl AddLifetimeBoundToImplParameter for T { fn id(self) -> Self { self } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddLifetimeBoundToImplParameter for T { #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn id(self) -> Self { self } } // Add Trait Bound to Impl Parameter ------------------------------------------- trait AddTraitBoundToImplParameter { fn id(self) -> Self; } #[cfg(cfail1)] impl AddTraitBoundToImplParameter for T { fn id(self) -> Self { self } } #[cfg(not(cfail1))] #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddTraitBoundToImplParameter for T { #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] fn id(self) -> Self { self } } // Add #[no_mangle] to Method -------------------------------------------------- trait AddNoMangleToMethod { fn add_no_mangle_to_method(&self) { } } #[cfg(cfail1)] impl AddNoMangleToMethod for Foo { fn add_no_mangle_to_method(&self) { } } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl AddNoMangleToMethod for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] #[no_mangle] fn add_no_mangle_to_method(&self) { } } // Make Method #[inline] ------------------------------------------------------- trait MakeMethodInline { fn make_method_inline(&self) -> u8 { 0 } } #[cfg(cfail1)] impl MakeMethodInline for Foo { fn make_method_inline(&self) -> u8 { 0 } } #[cfg(not(cfail1))] #[rustc_clean(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] impl MakeMethodInline for Foo { #[rustc_dirty(label="Hir", cfg="cfail2")] #[rustc_clean(label="Hir", cfg="cfail3")] #[inline] fn make_method_inline(&self) -> u8 { 0 } }