rust/library/stdarch
Nicholas Nethercote ddf10db1a3 Fix the features macro.
The first rule of the `features` macro looks like this:
```
macro_rules! features {
    (
      @TARGET: $target:ident;
      @CFG: $cfg:meta;
      @MACRO_NAME: $macro_name:ident;
      @MACRO_ATTRS: $(#[$macro_attrs:meta])*
      $(@BIND_FEATURE_NAME: $bind_feature:tt; $feature_impl:tt; $(#[$deprecate_attr:meta];)?)*
      $(@NO_RUNTIME_DETECTION: $nort_feature:tt; )*
      $(@FEATURE: #[$stability_attr:meta] $feature:ident: $feature_lit:tt;
          $(without cfg check: $feature_cfg_check:literal;)?
          $(implied by target_features: [$($target_feature_lit:tt),*];)?
          $(#[$feature_comment:meta])*)*
    ) => {
```
Notice all the `tt` specifiers. They are used because they are forwarded
to another macro. Only `ident`, `lifetime`, and `tt` specifiers can be
forwarded this way.

But there is an exception: `$feature_lit:tt`, which was added recently.
In theory it should cause an error like this:
```
error: no rules expected `literal` metavariable
   --> /home/njn/dev/rust3/library/stdarch/crates/std_detect/src/detect/macros.rs:54:91
    |
51  | /         macro_rules! $macro_name {
52  | |             $(
53  | |                 ($feature_lit) => {
54  | |                     $crate::detect_feature!($feature, $feature_lit $(, without cfg check: $feature_cfg_check)? ...
    | |                                                                                           ^^^^^^^^^^^^^^^^^^ no rules expected this token in macro call
...   |
88  | |             };
89  | |         }
    | |_________- in this expansion of `is_x86_feature_detected!`
    |
   ::: std/tests/run-time-detect.rs:145:27
    |
145 |       println!("tsc: {:?}", is_x86_feature_detected!("tsc"));
    |                             ------------------------------- in this macro invocation
    |
note: while trying to match keyword `true`
   --> /home/njn/dev/rust3/library/stdarch/crates/std_detect/src/detect/macros.rs:12:55
    |
12  |     ($feature:tt, $feature_lit:tt, without cfg check: true) => {
    |                                                       ^^^^
    = note: captured metavariables except for `:tt`, `:ident` and `:lifetime` cannot be compared to other tokens
    = note: see <https://doc.rust-lang.org/nightly/reference/macros-by-example.html#forwarding-a-matched-fragment> for more information
```
(The URL at the end of the error has more details about this forwarding
limitation.)

In practice it doesn't cause this error. I'm not sure why, but the
existing macro implementation in rustc is far from perfect, so it's
believable that it does the wrong thing here.

Why does this matter? Because https://github.com/rust-lang/rust/pull/124141
is modifying the macro implementation, and when that PR is applied the
error *does* occur. (It's one of several cases I have found where the
existing compiler accepts code it shouldn't, but #124141 causes that
code to be rejected.)

Fortunately the fix is simple: replace the `literal` specifier with `tt`.
2024-11-30 21:32:50 +00:00
..
.github/workflows remove docs publishing 2024-11-28 15:24:24 +00:00
ci move wasm comment to a better place 2024-11-10 21:49:11 +08:00
crates Fix the features macro. 2024-11-30 21:32:50 +00:00
examples Simplify some code in examples 2024-11-29 23:37:33 +00:00
intrinsics_data Use arm_intrinsics.json in stdarch-verify 2023-05-15 17:34:11 +02:00
.cirrus.yml Update FreeBSD 13 CI image 2024-03-06 19:12:01 +00:00
.gitignore Add intrinsic code generator for LoongArch 2024-02-28 08:43:52 +00:00
.gitmodules Remove ACLE submodule 2023-05-15 17:34:11 +02:00
Cargo.toml Add all crates to workspace 2024-09-30 13:23:20 -04:00
CONTRIBUTING.md Recommend using run-docker.sh instead of run.sh in CONTRIBUTING.md 2024-11-27 09:30:19 +08:00
LICENSE-APACHE Add license files 2017-09-25 12:43:06 -07:00
LICENSE-MIT Add license files 2017-09-25 12:43:06 -07:00
README.md Use SPDX license format and update packed_simd crate link (#1297) 2022-03-17 10:55:51 +00:00
rustfmt.toml Update the intrinsic checker tool (#1258) 2021-12-04 13:03:30 +00:00
triagebot.toml Enable feature detection on all Apple/Darwin targets 2024-09-14 04:25:01 +01:00
vendor.yml Update repo name 2019-07-09 01:37:07 +02:00

stdarch - Rust's standard library SIMD components

Actions Status

Crates

This repository contains two main crates:

  • core_arch implements core::arch - Rust's core library architecture-specific intrinsics, and

  • std_detect implements std::detect - Rust's standard library run-time CPU feature detection.

The std::simd component now lives in the packed_simd_2 crate.