/src/test/incremental/hashes/enum_defs.rs

https://gitlab.com/jianglu/rust · Rust · 653 lines · 439 code · 157 blank · 57 comment · 0 complexity · 5e543b635c0831709498b94d42995487 MD5 · raw file

  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.
  4. //
  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.
  10. // This test case tests the incremental compilation hash (ICH) implementation
  11. // for enum definitions.
  12. // The general pattern followed here is: Change one thing between rev1 and rev2
  13. // and make sure that the hash has changed, then change nothing between rev2 and
  14. // rev3 and make sure that the hash has not changed.
  15. // We also test the ICH for enum definitions exported in metadata. Same as
  16. // above, we want to make sure that the change between rev1 and rev2 also
  17. // results in a change of the ICH for the enum's metadata, and that it stays
  18. // the same between rev2 and rev3.
  19. // compile-pass
  20. // revisions: cfail1 cfail2 cfail3
  21. // compile-flags: -Z query-dep-graph -Zincremental-ignore-spans
  22. #![allow(warnings)]
  23. #![feature(rustc_attrs)]
  24. #![feature(stmt_expr_attributes)]
  25. #![crate_type="rlib"]
  26. // Change enum visibility -----------------------------------------------------
  27. #[cfg(cfail1)]
  28. enum EnumVisibility { A }
  29. #[cfg(not(cfail1))]
  30. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  31. #[rustc_clean(cfg="cfail3")]
  32. pub enum EnumVisibility {
  33. A
  34. }
  35. // Change name of a c-style variant -------------------------------------------
  36. #[cfg(cfail1)]
  37. enum EnumChangeNameCStyleVariant {
  38. Variant1,
  39. Variant2,
  40. }
  41. #[cfg(not(cfail1))]
  42. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  43. #[rustc_clean(cfg="cfail3")]
  44. enum EnumChangeNameCStyleVariant {
  45. Variant1,
  46. Variant2Changed,
  47. }
  48. // Change name of a tuple-style variant ---------------------------------------
  49. #[cfg(cfail1)]
  50. enum EnumChangeNameTupleStyleVariant {
  51. Variant1,
  52. Variant2(u32, f32),
  53. }
  54. #[cfg(not(cfail1))]
  55. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  56. #[rustc_clean(cfg="cfail3")]
  57. enum EnumChangeNameTupleStyleVariant {
  58. Variant1,
  59. Variant2Changed(u32, f32),
  60. }
  61. // Change name of a struct-style variant --------------------------------------
  62. #[cfg(cfail1)]
  63. enum EnumChangeNameStructStyleVariant {
  64. Variant1,
  65. Variant2 { a: u32, b: f32 },
  66. }
  67. #[cfg(not(cfail1))]
  68. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  69. #[rustc_clean(cfg="cfail3")]
  70. enum EnumChangeNameStructStyleVariant {
  71. Variant1,
  72. Variant2Changed { a: u32, b: f32 },
  73. }
  74. // Change the value of a c-style variant --------------------------------------
  75. #[cfg(cfail1)]
  76. enum EnumChangeValueCStyleVariant0 {
  77. Variant1,
  78. Variant2 = 11,
  79. }
  80. #[cfg(not(cfail1))]
  81. #[rustc_clean(cfg="cfail2", except="HirBody")]
  82. #[rustc_clean(cfg="cfail3")]
  83. enum EnumChangeValueCStyleVariant0 {
  84. Variant1,
  85. Variant2 =
  86. 22,
  87. }
  88. #[cfg(cfail1)]
  89. enum EnumChangeValueCStyleVariant1 {
  90. Variant1,
  91. Variant2,
  92. }
  93. #[cfg(not(cfail1))]
  94. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  95. #[rustc_clean(cfg="cfail3")]
  96. enum EnumChangeValueCStyleVariant1 {
  97. Variant1,
  98. Variant2 = 11,
  99. }
  100. // Add a c-style variant ------------------------------------------------------
  101. #[cfg(cfail1)]
  102. enum EnumAddCStyleVariant {
  103. Variant1,
  104. }
  105. #[cfg(not(cfail1))]
  106. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  107. #[rustc_clean(cfg="cfail3")]
  108. enum EnumAddCStyleVariant {
  109. Variant1,
  110. Variant2,
  111. }
  112. // Remove a c-style variant ---------------------------------------------------
  113. #[cfg(cfail1)]
  114. enum EnumRemoveCStyleVariant {
  115. Variant1,
  116. Variant2,
  117. }
  118. #[cfg(not(cfail1))]
  119. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  120. #[rustc_clean(cfg="cfail3")]
  121. enum EnumRemoveCStyleVariant {
  122. Variant1,
  123. }
  124. // Add a tuple-style variant --------------------------------------------------
  125. #[cfg(cfail1)]
  126. enum EnumAddTupleStyleVariant {
  127. Variant1,
  128. }
  129. #[cfg(not(cfail1))]
  130. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  131. #[rustc_clean(cfg="cfail3")]
  132. enum EnumAddTupleStyleVariant {
  133. Variant1,
  134. Variant2(u32, f32),
  135. }
  136. // Remove a tuple-style variant -----------------------------------------------
  137. #[cfg(cfail1)]
  138. enum EnumRemoveTupleStyleVariant {
  139. Variant1,
  140. Variant2(u32, f32),
  141. }
  142. #[cfg(not(cfail1))]
  143. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  144. #[rustc_clean(cfg="cfail3")]
  145. enum EnumRemoveTupleStyleVariant {
  146. Variant1,
  147. }
  148. // Add a struct-style variant -------------------------------------------------
  149. #[cfg(cfail1)]
  150. enum EnumAddStructStyleVariant {
  151. Variant1,
  152. }
  153. #[cfg(not(cfail1))]
  154. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  155. #[rustc_clean(cfg="cfail3")]
  156. enum EnumAddStructStyleVariant {
  157. Variant1,
  158. Variant2 { a: u32, b: f32 },
  159. }
  160. // Remove a struct-style variant ----------------------------------------------
  161. #[cfg(cfail1)]
  162. enum EnumRemoveStructStyleVariant {
  163. Variant1,
  164. Variant2 { a: u32, b: f32 },
  165. }
  166. #[cfg(not(cfail1))]
  167. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  168. #[rustc_clean(cfg="cfail3")]
  169. enum EnumRemoveStructStyleVariant {
  170. Variant1,
  171. }
  172. // Change the type of a field in a tuple-style variant ------------------------
  173. #[cfg(cfail1)]
  174. enum EnumChangeFieldTypeTupleStyleVariant {
  175. Variant1(u32, u32),
  176. }
  177. #[cfg(not(cfail1))]
  178. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  179. #[rustc_clean(cfg="cfail3")]
  180. enum EnumChangeFieldTypeTupleStyleVariant {
  181. Variant1(u32,
  182. u64),
  183. }
  184. // Change the type of a field in a struct-style variant -----------------------
  185. #[cfg(cfail1)]
  186. enum EnumChangeFieldTypeStructStyleVariant {
  187. Variant1,
  188. Variant2 { a: u32, b: u32 },
  189. }
  190. #[cfg(not(cfail1))]
  191. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  192. #[rustc_clean(cfg="cfail3")]
  193. enum EnumChangeFieldTypeStructStyleVariant {
  194. Variant1,
  195. Variant2 {
  196. a: u32,
  197. b: u64
  198. },
  199. }
  200. // Change the name of a field in a struct-style variant -----------------------
  201. #[cfg(cfail1)]
  202. enum EnumChangeFieldNameStructStyleVariant {
  203. Variant1 { a: u32, b: u32 },
  204. }
  205. #[cfg(not(cfail1))]
  206. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  207. #[rustc_clean(cfg="cfail3")]
  208. enum EnumChangeFieldNameStructStyleVariant {
  209. Variant1 { a: u32, c: u32 },
  210. }
  211. // Change order of fields in a tuple-style variant ----------------------------
  212. #[cfg(cfail1)]
  213. enum EnumChangeOrderTupleStyleVariant {
  214. Variant1(u32, u64),
  215. }
  216. #[cfg(not(cfail1))]
  217. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  218. #[rustc_clean(cfg="cfail3")]
  219. enum EnumChangeOrderTupleStyleVariant {
  220. Variant1(
  221. u64,
  222. u32),
  223. }
  224. // Change order of fields in a struct-style variant ---------------------------
  225. #[cfg(cfail1)]
  226. enum EnumChangeFieldOrderStructStyleVariant {
  227. Variant1 { a: u32, b: f32 },
  228. }
  229. #[cfg(not(cfail1))]
  230. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  231. #[rustc_clean(cfg="cfail3")]
  232. enum EnumChangeFieldOrderStructStyleVariant {
  233. Variant1 { b: f32, a: u32 },
  234. }
  235. // Add a field to a tuple-style variant ---------------------------------------
  236. #[cfg(cfail1)]
  237. enum EnumAddFieldTupleStyleVariant {
  238. Variant1(u32, u32),
  239. }
  240. #[cfg(not(cfail1))]
  241. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  242. #[rustc_clean(cfg="cfail3")]
  243. enum EnumAddFieldTupleStyleVariant {
  244. Variant1(u32, u32, u32),
  245. }
  246. // Add a field to a struct-style variant --------------------------------------
  247. #[cfg(cfail1)]
  248. enum EnumAddFieldStructStyleVariant {
  249. Variant1 { a: u32, b: u32 },
  250. }
  251. #[cfg(not(cfail1))]
  252. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  253. #[rustc_clean(cfg="cfail3")]
  254. enum EnumAddFieldStructStyleVariant {
  255. Variant1 { a: u32, b: u32, c: u32 },
  256. }
  257. // Add #[must_use] to the enum ------------------------------------------------
  258. #[cfg(cfail1)]
  259. enum EnumAddMustUse {
  260. Variant1,
  261. Variant2,
  262. }
  263. #[cfg(not(cfail1))]
  264. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  265. #[rustc_clean(cfg="cfail3")]
  266. #[must_use]
  267. enum EnumAddMustUse {
  268. Variant1,
  269. Variant2,
  270. }
  271. // Add #[repr(C)] to the enum -------------------------------------------------
  272. #[cfg(cfail1)]
  273. enum EnumAddReprC {
  274. Variant1,
  275. Variant2,
  276. }
  277. #[cfg(not(cfail1))]
  278. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeOfItem")]
  279. #[rustc_clean(cfg="cfail3")]
  280. #[repr(C)]
  281. enum EnumAddReprC {
  282. Variant1,
  283. Variant2,
  284. }
  285. // Change the name of a type parameter ----------------------------------------
  286. #[cfg(cfail1)]
  287. enum EnumChangeNameOfTypeParameter<S> {
  288. Variant1(S),
  289. }
  290. #[cfg(not(cfail1))]
  291. #[rustc_dirty(cfg="cfail2")]
  292. #[rustc_clean(cfg="cfail3")]
  293. enum EnumChangeNameOfTypeParameter<T> {
  294. Variant1(T),
  295. }
  296. // Add a type parameter ------------------------------------------------------
  297. #[cfg(cfail1)]
  298. enum EnumAddTypeParameter<S> {
  299. Variant1(S),
  300. Variant2(S),
  301. }
  302. #[cfg(not(cfail1))]
  303. #[rustc_dirty(cfg="cfail2")]
  304. #[rustc_clean(cfg="cfail3")]
  305. enum EnumAddTypeParameter<S, T> {
  306. Variant1(S),
  307. Variant2(T),
  308. }
  309. // Change the name of a lifetime parameter ------------------------------------
  310. #[cfg(cfail1)]
  311. enum EnumChangeNameOfLifetimeParameter<'a> {
  312. Variant1(&'a u32),
  313. }
  314. #[cfg(not(cfail1))]
  315. #[rustc_dirty(cfg="cfail2", except="PredicatesOfItem")]
  316. #[rustc_clean(cfg="cfail3")]
  317. enum EnumChangeNameOfLifetimeParameter<'b> {
  318. Variant1(&'b u32),
  319. }
  320. // Add a lifetime parameter ---------------------------------------------------
  321. #[cfg(cfail1)]
  322. enum EnumAddLifetimeParameter<'a> {
  323. Variant1(&'a u32),
  324. Variant2(&'a u32),
  325. }
  326. #[cfg(not(cfail1))]
  327. #[rustc_dirty(cfg="cfail2", except="PredicatesOfItem")]
  328. #[rustc_clean(cfg="cfail3")]
  329. enum EnumAddLifetimeParameter<'a, 'b> {
  330. Variant1(&'a u32),
  331. Variant2(&'b u32),
  332. }
  333. // Add a lifetime bound to a lifetime parameter -------------------------------
  334. #[cfg(cfail1)]
  335. enum EnumAddLifetimeParameterBound<'a, 'b> {
  336. Variant1(&'a u32),
  337. Variant2(&'b u32),
  338. }
  339. #[cfg(not(cfail1))]
  340. #[rustc_dirty(cfg="cfail2", except="GenericsOfItem,TypeOfItem")]
  341. #[rustc_clean(cfg="cfail3")]
  342. enum EnumAddLifetimeParameterBound<'a, 'b: 'a> {
  343. Variant1(&'a u32),
  344. Variant2(&'b u32),
  345. }
  346. // Add a lifetime bound to a type parameter -----------------------------------
  347. #[cfg(cfail1)]
  348. enum EnumAddLifetimeBoundToParameter<'a, T> {
  349. Variant1(T),
  350. Variant2(&'a u32),
  351. }
  352. #[cfg(not(cfail1))]
  353. #[rustc_dirty(cfg="cfail2", except="TypeOfItem")]
  354. #[rustc_clean(cfg="cfail3")]
  355. enum EnumAddLifetimeBoundToParameter<'a, T: 'a> {
  356. Variant1(T),
  357. Variant2(&'a u32),
  358. }
  359. // Add a trait bound to a type parameter --------------------------------------
  360. #[cfg(cfail1)]
  361. enum EnumAddTraitBound<S> {
  362. Variant1(S),
  363. }
  364. #[cfg(not(cfail1))]
  365. #[rustc_dirty(cfg="cfail2")]
  366. #[rustc_clean(cfg="cfail3")]
  367. enum EnumAddTraitBound<T: Sync> {
  368. Variant1(T),
  369. }
  370. // Add a lifetime bound to a lifetime parameter in where clause ---------------
  371. #[cfg(cfail1)]
  372. enum EnumAddLifetimeParameterBoundWhere<'a, 'b> {
  373. Variant1(&'a u32),
  374. Variant2(&'b u32),
  375. }
  376. #[cfg(not(cfail1))]
  377. #[rustc_dirty(cfg="cfail2", except="GenericsOfItem,TypeOfItem")]
  378. #[rustc_clean(cfg="cfail3")]
  379. enum EnumAddLifetimeParameterBoundWhere<'a, 'b> where 'b: 'a {
  380. Variant1(&'a u32),
  381. Variant2(&'b u32),
  382. }
  383. // Add a lifetime bound to a type parameter in where clause -------------------
  384. #[cfg(cfail1)]
  385. enum EnumAddLifetimeBoundToParameterWhere<'a, T> {
  386. Variant1(T),
  387. Variant2(&'a u32),
  388. }
  389. #[cfg(not(cfail1))]
  390. #[rustc_dirty(cfg="cfail2", except="TypeOfItem")]
  391. #[rustc_clean(cfg="cfail3")]
  392. enum EnumAddLifetimeBoundToParameterWhere<'a, T> where T: 'a {
  393. Variant1(T),
  394. Variant2(&'a u32),
  395. }
  396. // Add a trait bound to a type parameter in where clause ----------------------
  397. #[cfg(cfail1)]
  398. enum EnumAddTraitBoundWhere<S> {
  399. Variant1(S),
  400. }
  401. #[cfg(not(cfail1))]
  402. #[rustc_dirty(cfg="cfail2")]
  403. #[rustc_clean(cfg="cfail3")]
  404. enum EnumAddTraitBoundWhere<T> where T: Sync {
  405. Variant1(T),
  406. }
  407. // In an enum with two variants, swap usage of type parameters ----------------
  408. #[cfg(cfail1)]
  409. enum EnumSwapUsageTypeParameters<A, B> {
  410. Variant1 { a: A },
  411. Variant2 { a: B },
  412. }
  413. #[cfg(not(cfail1))]
  414. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  415. #[rustc_clean(cfg="cfail3")]
  416. enum EnumSwapUsageTypeParameters<A, B> {
  417. Variant1 {
  418. a: B
  419. },
  420. Variant2 {
  421. a: A
  422. },
  423. }
  424. // In an enum with two variants, swap usage of lifetime parameters ------------
  425. #[cfg(cfail1)]
  426. enum EnumSwapUsageLifetimeParameters<'a, 'b> {
  427. Variant1 { a: &'a u32 },
  428. Variant2 { b: &'b u32 },
  429. }
  430. #[cfg(not(cfail1))]
  431. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  432. #[rustc_clean(cfg="cfail3")]
  433. enum EnumSwapUsageLifetimeParameters<'a, 'b> {
  434. Variant1 {
  435. a: &'b u32
  436. },
  437. Variant2 {
  438. b: &'a u32
  439. },
  440. }
  441. struct ReferencedType1;
  442. struct ReferencedType2;
  443. // Change field type in tuple-style variant indirectly by modifying a use statement
  444. mod change_field_type_indirectly_tuple_style {
  445. #[cfg(cfail1)]
  446. use super::ReferencedType1 as FieldType;
  447. #[cfg(not(cfail1))]
  448. use super::ReferencedType2 as FieldType;
  449. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  450. #[rustc_clean(cfg="cfail3")]
  451. enum TupleStyle {
  452. Variant1(
  453. FieldType
  454. )
  455. }
  456. }
  457. // Change field type in record-style variant indirectly by modifying a use statement
  458. mod change_field_type_indirectly_struct_style {
  459. #[cfg(cfail1)]
  460. use super::ReferencedType1 as FieldType;
  461. #[cfg(not(cfail1))]
  462. use super::ReferencedType2 as FieldType;
  463. #[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
  464. #[rustc_clean(cfg="cfail3")]
  465. enum StructStyle {
  466. Variant1 {
  467. a: FieldType
  468. }
  469. }
  470. }
  471. trait ReferencedTrait1 {}
  472. trait ReferencedTrait2 {}
  473. // Change trait bound of type parameter indirectly by modifying a use statement
  474. mod change_trait_bound_indirectly {
  475. #[cfg(cfail1)]
  476. use super::ReferencedTrait1 as Trait;
  477. #[cfg(not(cfail1))]
  478. use super::ReferencedTrait2 as Trait;
  479. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,PredicatesOfItem")]
  480. #[rustc_clean(cfg="cfail3")]
  481. enum Enum<T: Trait> {
  482. Variant1(T)
  483. }
  484. }
  485. // Change trait bound of type parameter in where clause indirectly by modifying a use statement
  486. mod change_trait_bound_indirectly_where {
  487. #[cfg(cfail1)]
  488. use super::ReferencedTrait1 as Trait;
  489. #[cfg(not(cfail1))]
  490. use super::ReferencedTrait2 as Trait;
  491. #[rustc_clean(cfg="cfail2", except="Hir,HirBody,PredicatesOfItem")]
  492. #[rustc_clean(cfg="cfail3")]
  493. enum Enum<T> where T: Trait {
  494. Variant1(T)
  495. }
  496. }