]> git.lizzy.rs Git - rust.git/blob - tests/ui/target-feature/feature-hierarchy.rs
Rollup merge of #107194 - xfix:remove-slice-internals-dependency-in-rustc-ast, r...
[rust.git] / tests / ui / target-feature / feature-hierarchy.rs
1 // revisions: aarch64-neon aarch64-sve2
2 // [aarch64-neon] compile-flags: -Ctarget-feature=+neon --target=aarch64-unknown-linux-gnu
3 // [aarch64-neon] needs-llvm-components: aarch64
4 // [aarch64-sve2] compile-flags: -Ctarget-feature=-neon,+sve2 --target=aarch64-unknown-linux-gnu
5 // [aarch64-sve2] needs-llvm-components: aarch64
6 // build-pass
7 #![no_core]
8 #![crate_type = "rlib"]
9 #![feature(intrinsics, rustc_attrs, no_core, lang_items, staged_api)]
10 #![stable(feature = "test", since = "1.0.0")]
11
12 // Tests vetting "feature hierarchies" in the cases where we impose them.
13
14 // Supporting minimal rust core code
15 #[lang = "sized"]
16 trait Sized {}
17 #[lang = "copy"]
18 trait Copy {}
19 impl Copy for bool {}
20
21 extern "rust-intrinsic" {
22     #[rustc_const_stable(feature = "test", since = "1.0.0")]
23     fn unreachable() -> !;
24 }
25
26 #[rustc_builtin_macro]
27 macro_rules! cfg {
28     ($($cfg:tt)*) => {};
29 }
30
31 // Test code
32 const fn do_or_die(cond: bool) {
33     if cond {
34     } else {
35         unsafe { unreachable() }
36     }
37 }
38
39 macro_rules! assert {
40     ($x:expr $(,)?) => {
41         const _: () = do_or_die($x);
42     };
43 }
44
45
46 #[cfg(aarch64_neon)]
47 fn check_neon_not_sve2() {
48     // This checks that a normal aarch64 target doesn't suddenly jump up the feature hierarchy.
49     assert!(cfg!(target_feature = "neon"));
50     assert!(cfg!(not(target_feature = "sve2")));
51 }
52
53 #[cfg(aarch64_sve2)]
54 fn check_sve2_includes_neon() {
55     // This checks that aarch64's sve2 includes neon
56     assert!(cfg!(target_feature = "neon"));
57     assert!(cfg!(target_feature = "sve2"));
58 }