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 struct 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 struct 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 struct'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
30 #![feature(rustc_attrs)]
33 // Layout ----------------------------------------------------------------------
35 pub struct LayoutPacked;
38 #[rustc_dirty(label="Hir", cfg="cfail2")]
39 #[rustc_clean(label="Hir", cfg="cfail3")]
40 #[rustc_metadata_dirty(cfg="cfail2")]
41 #[rustc_metadata_clean(cfg="cfail3")]
43 pub struct LayoutPacked;
49 #[rustc_dirty(label="Hir", cfg="cfail2")]
50 #[rustc_clean(label="Hir", cfg="cfail3")]
51 #[rustc_metadata_dirty(cfg="cfail2")]
52 #[rustc_metadata_clean(cfg="cfail3")]
57 // Tuple Struct Change Field Type ----------------------------------------------
60 struct TupleStructFieldType(i32);
63 #[rustc_dirty(label="Hir", cfg="cfail2")]
64 #[rustc_clean(label="Hir", cfg="cfail3")]
65 #[rustc_metadata_clean(cfg="cfail2")]
66 #[rustc_metadata_clean(cfg="cfail3")]
67 struct TupleStructFieldType(
68 #[rustc_metadata_dirty(cfg="cfail2")]
69 #[rustc_metadata_clean(cfg="cfail3")]
74 // Tuple Struct Add Field ------------------------------------------------------
77 struct TupleStructAddField(i32);
80 #[rustc_dirty(label="Hir", cfg="cfail2")]
81 #[rustc_clean(label="Hir", cfg="cfail3")]
82 #[rustc_metadata_dirty(cfg="cfail2")]
83 #[rustc_metadata_clean(cfg="cfail3")]
84 struct TupleStructAddField(
85 #[rustc_metadata_clean(cfg="cfail2")]
86 #[rustc_metadata_clean(cfg="cfail3")]
88 #[rustc_metadata_clean(cfg="cfail3")]
93 // Tuple Struct Field Visibility -----------------------------------------------
96 struct TupleStructFieldVisibility(char);
99 #[rustc_dirty(label="Hir", cfg="cfail2")]
100 #[rustc_clean(label="Hir", cfg="cfail3")]
101 #[rustc_metadata_dirty(cfg="cfail2")]
102 #[rustc_metadata_clean(cfg="cfail3")]
103 struct TupleStructFieldVisibility(pub char);
106 // Record Struct Field Type ----------------------------------------------------
109 struct RecordStructFieldType { x: f32 }
112 #[rustc_dirty(label="Hir", cfg="cfail2")]
113 #[rustc_clean(label="Hir", cfg="cfail3")]
114 #[rustc_metadata_clean(cfg="cfail2")]
115 #[rustc_metadata_clean(cfg="cfail3")]
116 struct RecordStructFieldType {
117 #[rustc_metadata_dirty(cfg="cfail2")]
118 #[rustc_metadata_clean(cfg="cfail3")]
123 // Record Struct Field Name ----------------------------------------------------
126 struct RecordStructFieldName { x: f32 }
129 #[rustc_dirty(label="Hir", cfg="cfail2")]
130 #[rustc_clean(label="Hir", cfg="cfail3")]
131 #[rustc_metadata_dirty(cfg="cfail2")]
132 #[rustc_metadata_clean(cfg="cfail3")]
133 struct RecordStructFieldName { y: f32 }
136 // Record Struct Add Field -----------------------------------------------------
139 struct RecordStructAddField { x: f32 }
142 #[rustc_dirty(label="Hir", cfg="cfail2")]
143 #[rustc_clean(label="Hir", cfg="cfail3")]
144 #[rustc_metadata_dirty(cfg="cfail2")]
145 #[rustc_metadata_clean(cfg="cfail3")]
146 struct RecordStructAddField {
147 #[rustc_metadata_clean(cfg="cfail2")]
148 #[rustc_metadata_clean(cfg="cfail3")]
150 #[rustc_metadata_clean(cfg="cfail3")]
154 // Record Struct Field Visibility ----------------------------------------------
157 struct RecordStructFieldVisibility { x: f32 }
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 struct RecordStructFieldVisibility {
165 #[rustc_metadata_dirty(cfg="cfail2")]
166 #[rustc_metadata_clean(cfg="cfail3")]
171 // Add Lifetime Parameter ------------------------------------------------------
174 struct AddLifetimeParameter<'a>(&'a f32, &'a f64);
177 #[rustc_dirty(label="Hir", cfg="cfail2")]
178 #[rustc_clean(label="Hir", cfg="cfail3")]
179 #[rustc_metadata_dirty(cfg="cfail2")]
180 #[rustc_metadata_clean(cfg="cfail3")]
181 struct AddLifetimeParameter<'a, 'b>(&'a f32, &'b f64);
184 // Add Lifetime Parameter Bound ------------------------------------------------
187 struct AddLifetimeParameterBound<'a, 'b>(&'a f32, &'b f64);
190 #[rustc_dirty(label="Hir", cfg="cfail2")]
191 #[rustc_clean(label="Hir", cfg="cfail3")]
192 #[rustc_metadata_dirty(cfg="cfail2")]
193 #[rustc_metadata_clean(cfg="cfail3")]
194 struct AddLifetimeParameterBound<'a, 'b: 'a>(
195 #[rustc_metadata_clean(cfg="cfail2")]
196 #[rustc_metadata_clean(cfg="cfail3")]
198 #[rustc_metadata_clean(cfg="cfail2")]
199 #[rustc_metadata_clean(cfg="cfail3")]
204 struct AddLifetimeParameterBoundWhereClause<'a, 'b>(&'a f32, &'b f64);
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 struct AddLifetimeParameterBoundWhereClause<'a, 'b>(
212 #[rustc_metadata_clean(cfg="cfail2")]
213 #[rustc_metadata_clean(cfg="cfail3")]
215 #[rustc_metadata_clean(cfg="cfail2")]
216 #[rustc_metadata_clean(cfg="cfail3")]
221 // Add Type Parameter ----------------------------------------------------------
224 struct AddTypeParameter<T1>(T1, T1);
227 #[rustc_dirty(label="Hir", cfg="cfail2")]
228 #[rustc_clean(label="Hir", cfg="cfail3")]
229 #[rustc_metadata_dirty(cfg="cfail2")]
230 #[rustc_metadata_clean(cfg="cfail3")]
231 struct AddTypeParameter<T1, T2>(
232 // The field contains the parent's Generics, so it's dirty even though its
233 // type hasn't changed.
234 #[rustc_metadata_dirty(cfg="cfail2")]
235 #[rustc_metadata_clean(cfg="cfail3")]
237 #[rustc_metadata_dirty(cfg="cfail2")]
238 #[rustc_metadata_clean(cfg="cfail3")]
243 // Add Type Parameter Bound ----------------------------------------------------
246 struct AddTypeParameterBound<T>(T);
249 #[rustc_dirty(label="Hir", cfg="cfail2")]
250 #[rustc_clean(label="Hir", cfg="cfail3")]
251 #[rustc_metadata_dirty(cfg="cfail2")]
252 #[rustc_metadata_clean(cfg="cfail3")]
253 struct AddTypeParameterBound<T: Send>(
254 #[rustc_metadata_clean(cfg="cfail2")]
255 #[rustc_metadata_clean(cfg="cfail3")]
261 struct AddTypeParameterBoundWhereClause<T>(T);
264 #[rustc_dirty(label="Hir", cfg="cfail2")]
265 #[rustc_clean(label="Hir", cfg="cfail3")]
266 #[rustc_metadata_dirty(cfg="cfail2")]
267 #[rustc_metadata_clean(cfg="cfail3")]
268 struct AddTypeParameterBoundWhereClause<T>(
269 #[rustc_metadata_clean(cfg="cfail2")]
270 #[rustc_metadata_clean(cfg="cfail3")]
275 // Empty struct ----------------------------------------------------------------
277 #[rustc_clean(label="Hir", cfg="cfail2")]
278 #[rustc_metadata_clean(cfg="cfail2")]
279 pub struct EmptyStruct;
282 // Visibility ------------------------------------------------------------------
288 #[rustc_dirty(label="Hir", cfg="cfail2")]
289 #[rustc_clean(label="Hir", cfg="cfail3")]
290 #[rustc_metadata_dirty(cfg="cfail2")]
291 #[rustc_metadata_clean(cfg="cfail3")]
292 pub struct Visibility;
297 struct ReferencedType1;
298 struct ReferencedType2;
300 // Tuple Struct Change Field Type Indirectly -----------------------------------
301 mod tuple_struct_change_field_type_indirectly {
303 use super::ReferencedType1 as FieldType;
305 use super::ReferencedType2 as FieldType;
307 #[rustc_dirty(label="Hir", cfg="cfail2")]
308 #[rustc_clean(label="Hir", cfg="cfail3")]
309 #[rustc_metadata_clean(cfg="cfail2")]
310 #[rustc_metadata_clean(cfg="cfail3")]
312 #[rustc_metadata_dirty(cfg="cfail2")]
313 #[rustc_metadata_clean(cfg="cfail3")]
319 // Record Struct Change Field Type Indirectly -----------------------------------
320 mod record_struct_change_field_type_indirectly {
322 use super::ReferencedType1 as FieldType;
324 use super::ReferencedType2 as FieldType;
326 #[rustc_dirty(label="Hir", cfg="cfail2")]
327 #[rustc_clean(label="Hir", cfg="cfail3")]
328 #[rustc_metadata_clean(cfg="cfail2")]
329 #[rustc_metadata_clean(cfg="cfail3")]
330 struct RecordStruct {
331 #[rustc_metadata_dirty(cfg="cfail2")]
332 #[rustc_metadata_clean(cfg="cfail3")]
340 trait ReferencedTrait1 {}
341 trait ReferencedTrait2 {}
343 // Change Trait Bound Indirectly -----------------------------------------------
344 mod change_trait_bound_indirectly {
346 use super::ReferencedTrait1 as Trait;
348 use super::ReferencedTrait2 as Trait;
350 #[rustc_dirty(label="Hir", cfg="cfail2")]
351 #[rustc_clean(label="Hir", cfg="cfail3")]
352 #[rustc_metadata_dirty(cfg="cfail2")]
353 #[rustc_metadata_clean(cfg="cfail3")]
354 struct Struct<T: Trait>(T);
357 // Change Trait Bound Indirectly In Where Clause -------------------------------
358 mod change_trait_bound_indirectly_in_where_clause {
360 use super::ReferencedTrait1 as Trait;
362 use super::ReferencedTrait2 as Trait;
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 struct Struct<T>(T) where T : Trait;