That's intentional before, since some time binutils may have supported that but the compiler doesn't, so GCC just bypasses that to binutils to let binutils reject those unknown extensions.
But I am considering rejecting those extensions or adding more checks on the GCC side recently too, because accepting unknown extensions might cause problems on the architecture extension test macro[1], it makes the value become unreliable if the extension version info isn't in GCC yet. So I am OK with this change but two minor comments : --- > riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension 'zvl' > starts with `z` but is not a standard sub-extension I would like to say it's `unsupported standard extension` rather than `not a standard sub-extension`. Because some extensions have just become ratified but GCC is unsupported yet, so `not a standard sub-extension` might confuse IMO. and why `extension` rather than `sub-extension`: IIRC `sub-extension` was used as an official term long ago, but it is called standard extension now[2]. ---- > riscv64-unknown-elf-gcc: error: '-march=rv64gcv_zvl128_s123': extension > 's123' start with `s` but not a standard supervisor extension `is` is missing. ---- Also I would like to reject unknown single letter extensions and `x` extensions too, for the same reason as the other two, except that make the architecture extension test macro less useful. [1] https://github.com/riscv-non-isa/riscv-c-api-doc/blob/master/riscv-c-api.md#architecture-extension-test-macro [2] https://github.com/riscv/riscv-isa-manual/blob/main/src/naming.adoc#additional-standard-extension-names